gpt4 book ai didi

javascript - 如何正确使用 Javascript 异步eachLimit

转载 作者:行者123 更新时间:2023-11-28 17:54:17 27 4
gpt4 key购买 nike

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

最佳答案

这里的问题是您正在使用异步库来实现非异步(或者表现得不像异步)的函数。 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 不是您的函数,并且该函数实际上是异步的,那么它要么使用 Promise,要么您需要找到一个可以正确编写异步函数的库。如果该函数不是异步的,则 async.eachLimit 将不起作用。

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

关于javascript - 如何正确使用 Javascript 异步eachLimit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com