[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

转载于:https://my.oschina.net/legendlee/blog/85464

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值