2017-07-18 36 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: