2014-07-16 21 views
1


我有接受两个数组和回调函数的函数,我使用async.each遍历其中一个数组(并尝试使用async.forEach并且两者都有相同的结果),一切正常,但我作为参数接收的回调,作为第三个参数发送,在第一次迭代后触发。这是我的代码。async.each/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被触发我的第一次迭代完成之后。

感谢和问候。

+0

嗨似乎要传递同样喜欢作为一个数组,而你最初定义喜欢作为函数 –

+0

@VivekBajpai,我为了简洁而改变了函数的名字,我想我不应该那样做。 – Babar

回答

2

在第一次迭代之后触发作为参数(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() 
+0

对,我很愚蠢,完全忽略了我们使用null或no参数执行回调的部分,非常感谢 – Babar

相关问题