node.js - 使用 forEach 时避免回调多次调用

标签 node.js asynchronous promise

我有一个处理数据数组(第一个参数)的函数,一旦处理完成,它仅调用一次回调函数(第二个参数)。我使用 forEach 逐项处理数据,包括在一些检查中处理每个项目并将参数存储在数据库中。函数 storeInDB() 执行存储工作,并在存储项目后使用回调(第二个参数)。

代码的第一种方法如下:

function doWork(data, callback) {
    data.forEach(function (item) {
        // Do some check on item
        ...
        storeInDB(item, function(err) {
           // check error etc.
           ...
           callback();
        });
    });
}

但是,这是错误的,因为 callback 函数将被调用多次(与 data 数组中的元素一样多)。

我想知道如何重构我的代码以实现所需的行为,即存储工作完成后仅调用一次callback。我猜async可以帮助完成这项任务,但我还没有找到组合 async + forEach 的正确模式。

感谢任何帮助!

最佳答案

您可以使用诸如async之类的库来执行此操作,尽管我建议如果可能的话使用promise。对于当前的问题,您可以使用计数器来确定已完成多少存储调用,并在总数完成时调用回调。

let counter = 0;
data.forEach(function (item) {
    // Do some check on item
    ...
    storeInDB(item, function(err) {
       // check error etc.
       counter++
       if (counter == data.length) {
         callback();
       }
    });
});

关于node.js - 使用 forEach 时避免回调多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50453706/

相关文章:

node.js - MongoDB/Mongoose 索引使查询更快还是变慢?

c# - 需要帮助解决有关异步服务器套接字的一些逻辑错误

c# - 什么是异步回调?

javascript - Bluebird .finally 不是函数 node.js 错误

android - 使用内置 CSRF 保护的 node.js 服务器,移动应用程序如何接收 CSRF token ?

node.js - 有没有办法在中断后将自定义数据返回到提示?

javascript - 将 request.body 解析为字符串然后创建 JSON

javascript - Meteor wrapAsync 没有在客户端返回值

javascript - 异步函数没有按应有的顺序执行

javascript - 如何在 JS 的 setInterval 中等待?