【问题标题】:How to properly use Javascript Async eachLimit如何正确使用 Javascript Async eachLimit
【发布时间】:2017-12-02 11:04:06
【问题描述】:

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

【问题讨论】:

  • 你是什么意思,“一个不包含回调的外部函数”?它是异步的吗?如果是,没有回调怎么知道完成了?

标签: javascript jquery async.js


【解决方案1】:

您的问题是您将异步库用于非异步(或不像异步一样)的函数。 async.eachLimit 所做的是遍历数组中的每个项目,一次只执行 limit 数量,并等待调用 callback() 表示当前迭代已完成,可以添加另一个要执行的迭代。

在您的代码示例中,回调(未注释时)在尝试调用 outsideFunction 后立即被调用,因为函数调用是非阻塞的。它不会等待,因为 async 说“我被告知它已经完成,我将继续下一个”,所以所有 100 将尝试同时执行。如果outsideFunction 是一个异步函数,它需要一个回调(或让它使用promise)来表明它已经完成执行,并且在该回调中你调用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 将不起作用。

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

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多