我是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
})
}
})
})
}
})
}
答案 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) {
// ...
})
或者,您可以使用async
和await
notifyRide: async (body) => {
// ...
// use 'await' instead of 'yield'
}
请注意,协同程序本身总是返回承诺。
对于上帝的爱,请使用一些缩进。我强烈建议像Airbnb一样遵循一个体面的风格guilde: