node.js - async.each/forEach 第三个参数(回调)在每个间隔后触发

标签 node.js loops asynchronous


我有接受两个数组和回调函数的函数,我正在使用 async.each 迭代其中一个数组(并尝试了 async.forEach 并且两者都有相同的结果),一切正常,但是我作为参数接收的回调,该回调在第一次迭代后触发第三个参数时发送。这是我的代码。

function itemLikes(instruments,likes, finalCallback){
var items = [];
if(instruments.length >= 1){
    async.forEach(instruments, function(instrument,cb){
        if(likes){
            if(likes.indexOf(instrument._id.toString()) !== -1){
                instrument.liked = 1;
                cb(items.push(instrument))
            }
            else{
                cb(items.push(instrument))
            }
        }
        else{
            cb(items.push(instrument))
        }
    }, function(err){
        finalCallback(items)
    })
}
else{
    finalCallback(items)
}

}

这是我从文档中了解到的,但我的 FinalCallback 在第一次迭代完成后立即触发。

感谢和问候。

最佳答案

第一次迭代后触发接收参数的回调(finalCallback())是因为asyc.each()的回调(cb)是用非空值调用的。当使用非空值调用它时,async.each() 的最终回调将被调用,然后调用您的finalCallback()。你需要做这样的事情:

if(likes){
  if(likes.indexOf(instrument._id.toString()) !== -1){
    instrument.liked = 1;
    items.push(instrument);
    cb()
  } else{
    items.push(instrument);
    cb()
  }
} else{
  items.push(instrument);
  cb()
}

上面的逻辑似乎可以简化如下:

if(likes && likes.indexOf(instrument._id.toString()) !== -1){
    instrument.liked = 1;
}
items.push(instrument);
cb()

关于node.js - async.each/forEach 第三个参数(回调)在每个间隔后触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24772990/

相关文章:

javascript - 如何在 React Native 中使用 axios 将图像上传到服务器?

deployment - 当我希望使用 node.js 在我的项目中部署库时,应该包含哪些文件?

r - 循环功能并将列添加到 R 中的数据框

haskell - Haskell 异步如何在中断后可靠地运行清理操作?

ios - 从 Swift 函数中的异步调用返回数据

asp-classic - 如何在 asp classic 中触发异步调用并忽略响应?

node.js - Gremlin 如何同时包含数字和字符串搜索

node.js - Sequelize.js - 将项目添加到表中,连接到不同表中的用户

vb.net - VB.NET 中 do while 和 while 有什么区别?

java - 编写 for 循环/while 循环?