如何正确使用Javascript Async eachLimit

时间:2017-06-28 22:13:56

标签: javascript jquery async.js

我在使用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);
    }
 );

1 个答案:

答案 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将不起作用。

如果这是你的功能,你应该让它发回回来说它已经完成(或使用承诺)。