我在使用async.eachLimit时遇到问题。它适用于前10个元素,但它不会继续经过它;它只是结束了。所以,如果有100个元素,它只会执行前10个。这显然是我误解回调的问题。将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);
}
);
答案 0 :(得分:2)
你的问题是你正在使用异步库来处理非异步的函数(或者说它不像是异步的)。 async.eachLimit
执行的操作是遍历数组中的每个项目,一次仅执行limit
个数量,并等待调用callback()
说当前迭代已完成并可添加另一个被执行。
在您的代码示例中,回调(取消注释后)在尝试调用outsideFunction
后立即调用,因为函数调用是非阻塞的。它不等待,因为async说“我已经告诉它已经完成了,我将进入下一个”所以所有100个将尝试并同时执行。如果outsideFunction
是一个异步函数,它需要一个回调(或让它使用promises)来说它已经完成执行,并且在该回调中你调用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
不是你的函数,并且函数实际上是异步的,那么它要么使用promises,要么你需要找到一个正确编写异步函数的库。如果该函数不是异步的,则async.eachLimit
将不起作用。
如果这是你的功能,你应该让它发回回来说它已经完成(或使用承诺)。