循环在节点js中无法正常工作

时间:2017-07-18 15:20:05

标签: node.js mongoose koa

我是nodejs的新手,因为循环不能同步工作。请提前帮助

这是我的代码

 notifyRide:function*(body){
  yield User.find({_id: {$ne: body.userId}},function(err, doc){
   if(doc != null){
    User.findOne({_id:body.userId},function(err, user){
     Ride.findOne({_id : body.rideid},function*(err1,ride){
      for (var i = 0; i < doc.length; i++) {
       console.log(i)// getting 0
       yield rideStatus.findOne({$and:[{receiver_id:doc[i]._id},{ride_id:body.rideid}]}, function(err, response)
       {
         console.log(i);//getting 1
       })
      }
     })
   })
  }
})

}

1 个答案:

答案 0 :(得分:2)

由于您似乎使用基于生成器的协同程序,为什么不使用Mongoose方法返回的promise?参见:

例如,而不是:

Ride.findOne({_id : body.rideid}, function*(err1,ride) ...

你可以使用:

let ride = yield Ride.findOne({_id : body.rideid});

并避免嵌套函数。否则,你不是从正确的生成器中产生的东西,而是忽略了屈服的值。

还要确保如果要使用基于生成器的协同程序,而不是正确包装生成器函数。例如:

notifyRide:function*(body) {
  // ...
}

应该是co

notifyRide: co.wrap(function* (body) {
  // ...
})

或与Bluebird:

notifyRide: P.coroutine(function* (body) {
  // ...
})

或者,您可以使用asyncawait

notifyRide: async (body) => {
  // ...
  // use 'await' instead of 'yield'
}

请注意,协同程序本身总是返回承诺。

对于上帝的爱,请使用一些缩进。我强烈建议像Airbnb一样遵循一个体面的风格guilde: