欲三更@cnblogs 发表于 2012-12-10 15:18:08

Javascript中给一个使用了setTimeout的深度递归设置完成后回调

<div id="cnblogs_post_body">问题:
因为递归太深而使用了异步的 setTimeout 清空调用栈,整个递归变成了异步的行为,函数已经提前返回了,现在怎么设置整个递归完成后的回调?
回答:
看了问题评论才理解你的意思,我按照你的目的写了一个能调试的代码,你看看跟你问题中的代码是不是差不多:

<div class="cnblogs_code"> 1 // 无回调 2 function isArray(o) { 3   return toString.apply(o) === ''; 4 } 5 function foo(arr) { 6     console.log(arr); 7   if (isArray(arr)) { 8         for (i in arr) { 9             (function(j) {10             setTimeout(function() {11                 foo(arr);12             }, 0);13             })(i);14       }15     }16 }17 foo([, ]]);18 19 /*20 输出:21 [,]22 23 24 125 226 327 428 */29 30 //有回调31 function isArray(o) {32   return toString.apply(o) === '';33 }34 // 设置一个计数器,标识“已知的还未被遍历的元素数量”,起始值显然为135 var cbCounter = 1;36 function foo(arr, cb) {37   cbCounter += isArray(arr) ? arr.length : 0; // 把子元素的数加上,因为子元素现在已知了38    console.log(arr);39   if (isArray(arr)) {40         for (i in arr) {41             (function(j) {42             setTimeout(function() {43                 foo(arr, cb);44             }, 0);45             })(i);46       }47     }48   if ((--cbCounter === 0) && (typeof cb === 'function')) cb(); // 前面的--就是把自己刨出去49 }50 foo([, ], function() {51      console.log('I am a callback!');52 });53 54 /*55 输出:56 [,]57 58 59 160 261 362 463 I am a callback!64 */
页: [1]
查看完整版本: Javascript中给一个使用了setTimeout的深度递归设置完成后回调