[js]一段给使用了setTimeout的深度递归设置完成后回调的代码

注册了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

你可能感兴趣的:(js,settimeout)