2017-07-18 38 views
0

我是新来的nodejs for循环不能同步工作。请提前循环在节点js中无法正常工作

帮助这里感谢是我的代码

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

难道[我的回答](https://stackoverflow.com/questions/45170956/loop-not-working-正确地在节点js/45171189#45171189)下面帮助你?任何意见? – rsp

回答

2

既然你似乎可以用基于生成器的协同程序,你为什么不使用由猫鼬方法返回的承诺?请参阅:

例如,而不是:

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) { 
    // ... 
}) 

或这跟蓝鸟:

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

或者您可以使用asyncawait

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

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

为了上帝的爱,请使用一些缩进。我强烈建议下一个体面的风格guilde像一个被制作的Airbnb: