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

时间:2014-07-16 05:41:35

标签: 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在我的第一次迭代完成后立即被触发。

谢谢和问候。

1 个答案:

答案 0 :(得分:2)

在第一次迭代后触发作为参数接收的回调(finalCallback())的原因是因为使用非null值调用asyc.each()的回调(cb)。当使用非null值调用它时,会调用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()