Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/Node检查一个带有回调的循环是否完成_Javascript_Node.js - Fatal编程技术网

Javascript/Node检查一个带有回调的循环是否完成

Javascript/Node检查一个带有回调的循环是否完成,javascript,node.js,Javascript,Node.js,有没有办法知道node.js(js)中的异步循环是否完成了执行新函数或发送回调的最后一个过程?看看库。“每个”迭代器似乎都适合您的需要。您需要使用递归: 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

有没有办法知道node.js(js)中的异步循环是否完成了执行新函数或发送回调的最后一个过程?

看看库。“每个”迭代器似乎都适合您的需要。

您需要使用递归:

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

请更详细地解释您的问题。我在库中阅读,您对
eachSeries
、迭代器和回调声明有何想法?方法声明中有两个函数吗?async.eachSeries([2,3,5,7,11],函数(prime,callback){console.log(prime);callback();//或者:callback(new Error();},函数(err){if(err){throw err;}console.log('Well done:-)!';});