2017-06-28 60 views
0

我遇到了使用async.eachLimit的问题。它适用于前10个元素,但它不会继续过去;它只是结束。所以,如果有100个元素,它只会在前10个元素。这显然是我误解回调的问题。使用eachLimit和不包含回调的外部函数的正确方法是什么?还是这样的功能需要一个?如何正确使用Javascript异步eachLimit

async.eachLimit(items, 10, function(item, callback) { 
     outsideFunction(item.attrOne, item.attrTwo}; 
     //callback(); ---> leads to all running in parallel. 
    }, 
    function(err) { 
     console.log(err); 
    } 
); 
+1

你是什么意思,“一个不包含回调的外部函数”?它是否是异步的?如果是的话,当它没有回调时,你怎么知道它已经完成? – Bergi

回答

0

你这里的问题是您使用的是异步库函数不是异步的(或不像个它是异步的)。 async.eachLimit所做的是遍历数组中的每个项目,一次只执行limit个数量,并且等待callback()被称为当前迭代已完成,并且可以添加另一个要执行的项目。

在您的代码示例中,回调函数(未注释时)在它尝试调用outsideFunction后立即被调用,因为该函数调用是非阻塞的。它不会等待,因为异步说“我已经被告知完成了,我将进入下一个”,因此所有100个人都会尝试并同时执行。如果outsideFunction是一个异步函数,那么需要回调(或者让它使用承诺)来表示它已经完成执行,并且在该回调中您调用async.eachLimit的回调,然后它将一次只能执行10次你要。这里有一个例子:

async.eachLimit(items, 10, function(item, callback) 
{ 
    outsideFunction(item.attrOne, item.attrTwo, function(someResult) 
    { 
     // Your outside function calls back saying it's finished ... 
     callback(); // ... so we tell async we're done 
    }); 
}, 
function(err) 
{ 
    console.log(err); 
}); 

如果outsideFunction是不是你的函数,该函数实际上是异步的,那么它的无论是使用承诺或你需要找到,妥善写入异步函数库。如果该功能不是异步的,那么async.eachLimit将不起作用。

如果是你的函数,你应该让它发回一个回调来说明它已经完成(或使用promise)。