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

loop not working properly in node js

我是 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
       })
      }
     })
   })
  }
})

}

既然您似乎在使用基于生成器的协程,为什么不使用由 Mongoose 方法 return 编辑的承诺?参见:

例如,而不是:

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'
}

请注意协程本身总是 return promises。

看在上帝的份上,请使用一些缩进。我强烈建议遵循像 Airbnb 这样的体面的风格指南: