注册了OSC的账号之后一直没贴过blog文章,之前一直在这里查询软件信息,昨天注意看了一下发现这里的社区气氛挺好的,嗯,以后得多上OSC,多分享一些代码:) 我的代码写的不好,但是我脸皮厚不怕出丑哈哈~
问题是这样的:有时候为了防止UI长时间不响应,我们会在for循环中实用setTimeout异步执行,将cpu还给UI。但是这时候有一个问题,就是如何设置完成后回调。下面这段代码就是解决这个问题:
无回调:
function isArray(o) {
return toString.apply(o) === '[object Array]';
}
function foo(arr) {
console.log(arr);
if (isArray(arr)) {
for (i in arr) {
(function(j) {
setTimeout(function() {
foo(arr[j]);
}, 0);
})(i);
}
}
}
foo([[1, 2], [3, 4]]);
输出:
[[1,2],[3,4]]
[1,2]
[3,4]
1
2
3
4
function isArray(o) {
return toString.apply(o) === '[object Array]';
}
// 设置一个计数器,标识“已知的还未被遍历的元素数量”,起始值显然为1
var cbCounter = 1;
function foo(arr, cb) {
cbCounter += isArray(arr) ? arr.length : 0; // 把子元素的数加上,因为子元素现在已知了
console.log(arr);
if (isArray(arr)) {
for (i in arr) {
(function(j) {
setTimeout(function() {
foo(arr[j], cb);
}, 0);
})(i);
}
}
if ((--cbCounter === 0) && (typeof cb === 'function')) cb(); // 前面的--就是把自己刨出去
}
foo([[1, 2], [3, 4]], function() {
console.log('I am a callback!');
});
输出:
[[1,2],[3,4]]
[1,2]
[3,4]
1
2
3
4
I am a callback!
以上没有什么技术含量,就是试用一下OSC的blog。
源代码见:https://gist.github.com/3844668#file_asyn_recursion.js