現在、親のforループ(_m < repliesIDsArray.length
_)は、最初のfindOneが起動する前に完了するため、これはすべて、repliesIDsArray..asynchronous。の最後の要素のみをループします。
このコードセットの約束されたバージョンの適切な構文は何ですか? promisificationは初めてで、このpromisifyを開始する方法+配列をループする+ ifステートメントを説明する方法を考えています。
Bluebirdが必要であり、Promise.promisifyAll(require("mongoose"));
が呼び出されます。
_for(var m=0; m<repliesIDsArray.length; m++){
objectID = repliesIDsArray[m];
Models.Message.findOne({ "_id": req.params.message_id},
function (err, doc) {
if (doc) {
// loop over doc.replies to find the index(index1) of objectID at replies[index]._id
var index1;
for(var i=0; i<doc.replies.length; i++){
if (doc.replies[i]._id == objectID) {
index1 = i;
break;
}
}
// loop over doc.replies[index1].to and find the index(index2) of res.locals.username at replies[index1].to[index2]
var index2;
for(var j=0; j<doc.replies[index1].to.length; j++){
if (doc.replies[index1].to[j].username === res.locals.username) {
index2 = j;
break;
}
}
doc.replies[index1].to[index2].read.marked = true;
doc.replies[index1].to[index2].read.datetime = req.body.datetimeRead;
doc.replies[index1].to[index2].updated= req.body.datetimeRead;
doc.markModified('replies');
doc.save();
}
}); // .save() read.marked:true for each replyID of this Message for res.locals.username
} // for loop of repliesIDsArray
_
ベンジャミンが言ったように、for
ループを使用する代わりに、_Promise.each
_(または_.map
_)を使用します
Bluebird APIのドキュメントを見て ここ そして「静的マップの例:」を検索してください。 map
を使用すると、each
のドキュメントよりも理解しやすくなります。
_var Promise = require('bluebird')
// promisify the entire mongoose Model
var Message = Promise.promisifyAll(Models.Message)
Promise.each(repliesIDsArray, function(replyID){
return Message.findOneAsync({'_id': req.params.message_id})
.then(function(doc){
// do stuff with 'doc' here.
})
})
_
ドキュメントから、_.each
_(または_.map
_)は "an array, or a promise of an array, which contains promises (or a mix of promises and values)
"を取るので、100%純粋な値の配列で使用してpromiseチェーンを開始できます
それが役に立てば幸い!