如何强制for循环等待回调在nodejs中完成?

时间:2016-11-13 23:35:55

标签: node.js mongodb asynchronous

entry.find(function(err,user){
  for(var i=0;i<user.length;i++){
    if(user[i].tablenumber==-1){

       assigntable(user[i]);
    }
  }

});

所以我在这里尝试做的是在调用异步assigntable函数之前等待每个for循环完成。 Assigntable是对数据库进行更改的回调。 我现在遇到的问题是,在for循环结束后调用assigntable的回调,所有用户都将被分配到表1。 但我想要的是:将第一个分配给表1 - &gt;在下一循环中分配表检测表1被分配 - &gt;用户2分配给表2,依此类推。 我该怎么做?

编辑:Assgintable是一个递归调用,用于在回调中编辑数据库。更新将基于前一循环中生成的数据库的结果,但我在此处不相关。

  function assigntable(user,tableindex){
  console.log("in recursion with tableindex"+tableindex);
  if(tableindex==3)
  return;
  console.log(user.date+user.time+tableindex);
  entry.find({
      $and: [
          { "tablenumber": tableindex},
          { "date": user.date },
          {"time":user.time}
            ]
  },function(err, result) {
      if(result.length==0){
        console.log(result+"result is ");
        entry.update({"_id":user._id},{"tablenumber":tableindex},function(err, numberAffected) {
          if(!numberAffected){

          }
          else
          {
            console.log("entryupdated with "+tableindex)
          }
      });
      return;
  }
  else{
    console.log(tableindex);
    assigntabe(user,tableindex+1);
  }
})

}

1 个答案:

答案 0 :(得分:1)

您可以使用async.foreach来同步迭代:

entry.find(function(err,user){
  async.forEach(user, function (item, callback){ 
    if(item.tablenumber==-1){
       console.log(item);
       assigntable(item,1);
    }    
    callback(); 
  }, function(err) {
    console.log('iterating done');
  })}).sort({datesubmitted:1});