如何正确使用 Javascript Async eachLimit

ajb*_*jbs 2 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);
    }
 );
Run Code Online (Sandbox Code Playgroud)

小智 7

您在这里的问题是您使用异步库来处理非异步(或不表现为异步)的函数。什么async.eachLimit所做的是每个项目走在阵中,只执行limit一次量,并等待callback()被称为并称当前迭代完成,并可以添加到执行另一个。

在您的代码示例中,回调(未注释时)在尝试调用后立即被调用,outsideFunction因为函数调用是非阻塞的。它不会等待,因为 async 说“我已经被告知它已完成,我将进行下一个”,因此所有 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);
});
Run Code Online (Sandbox Code Playgroud)

如果outsideFunction不是您的函数,并且该函数实际上是异步的,那么它要么使用了 Promise,要么您需要找到一个可以正确编写异步函数的库。如果该函数不是异步的,async.eachLimit则将无法工作。

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