Javascript / Node检查回调完成的循环

时间:2014-05-09 15:05:49

标签: javascript node.js

是否存在某种方式来了解node.js(js)中的异步循环是否完成了执行新函数或发送回调的最后一个进程?

2 个答案:

答案 0 :(得分:2)

您需要使用递归:

do = function(i, data, callback){
    // if the end is reached, call the callback
    if(data.length === i+1)
       return callback()
    obj = data[i]
    doAsync(function(){
        // DO SOMETHING
        i++;
        // call do with the next object
        do(i, data, callback)
    });

}
do(0, [a, b, c], function(){
  THEN DO SOMETHING
});

因此,do将传递相同的回调,当到达结束时,将执行回调。这个方法非常干净但是,例如,如果你需要抓取50个页面,每个页面将被加载到队列中,等待另一个页面完成。

使用此功能

| google.com | yahoo.fr      | SO.com    | github.com | calling callback!
|  (856ms)   | (936ms)       | (787ms)   |  (658ms)   |

没有

| google.com (1056ms)    | 
| yahoo.fr (1136ms)       |
| SO.com (987ms)        |
| github.com (856ms)   |

另一种方法是计算应该调用异步函数的次数,每次结束一次,增加一个var,当所述var达到这个长度时,你调用回调。

do = function(data, callback){
    var done = 0;
    data.forEach(function(i, value){
       doAsync(function(){
           done++;
           if(done === data.length)
               callback()
       });
    });

}
do(0, [a, b, c], function(){
  THEN DO SOMETHING
});

然后它将是

| google.com (1056ms)    | 
| yahoo.fr (1136ms)       | calling callback!
| SO.com (987ms)        |
| github.com (856ms)   |
done = 0               1234

答案 1 :(得分:1)

看看this图书馆。似乎“每个”迭代器都适合您的需求。