Подтвердить что ты не робот

Bluebird Promisfy.each, с for-loops и if-statements?

Прямо сейчас родительский цикл for (цикл m < repliesIDsArray.length) завершается до первого срабатывания findOne, поэтому все это только проходит через последний элемент repliesIDsArray..асинхронный..

Каков правильный синтаксис для многообещающей версии этого набора кодов? Я новичок в обещании и задаюсь вопросом, как запустить этот цикл promisify + через массивы + учетные записи if-statements..

Требуется 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
4b9b3361

Ответ 1

Как сказал Бенджамин, вместо использования цикла for используйте Promise.each (или .map)

Посмотрите на документы API Bluebird здесь и найдите пример "статической карты:". С map понятнее, чем docs для 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% чистых значений в цепочку обещаний с обещаниями

Надеюсь, что это поможет!