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则将无法工作。
如果它是你的函数,你应该让它发回一个回调来表示它已经完成(或使用承诺)。
| 归档时间: |
|
| 查看次数: |
6107 次 |
| 最近记录: |