循环在节点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) {
// ...
})
或者您可以使用 async
和 await
notifyRide: async (body) => {
// ...
// use 'await' instead of 'yield'
}
请注意协程本身总是 return promises。
看在上帝的份上,请使用一些缩进。我强烈建议遵循像 Airbnb 这样的体面的风格指南:
我是 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) {
// ...
})
或者您可以使用 async
和 await
notifyRide: async (body) => {
// ...
// use 'await' instead of 'yield'
}
请注意协程本身总是 return promises。
看在上帝的份上,请使用一些缩进。我强烈建议遵循像 Airbnb 这样的体面的风格指南: