2017-07-18 9 views
0

ループのためにnodejsが新しく同期的に動作しません。あなたはマングースメソッドによって返される約束を使用しない理由発電機ベースのコルーチンを、使用しているように見えるので、事前ここノード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-:私は強くAirbnbずつのようなまともなスタイルguilde以下をお勧めします適切にノード内のjs/45171189#45171189)はあなたを助けますか?コメントはありますか? – rsp

答えて

2

です助けてください?

Ride.findOne({_id : body.rideid}, function*(err1,ride) ... 

はあなたが使用することができます:代わりに、例えば

let ride = yield Ride.findOne({_id : body.rideid}); 

をし、ネストされた関数を避ける参照してください。それ以外の場合は、正しいジェネレータからのものではなく、生成された値が無視されます。

また、ジェネレータ機能を適切にラップする必要があるよりも、ジェネレータベースのコルーチンを使用する場合は、必ず確認してください。例えば:ブルーバードと

notifyRide: co.wrap(function* (body) { 
    // ... 
}) 

またはこの:

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

また、あなたがasyncawait

notifyRide: async (body) => { 
    // ... 
    // use 'await' instead of 'yield' 
} 
を使用することができます

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

はおそらくcoと、このする必要があります

コルーチン自体は常に約束を返します。

そして、神の愛のために、いくつかのインデントを使用してください。

関連する問題