Выполнение множества обещаний с Q

Я пытаюсь подсчитать количество людей, назначенных на каждую смену, находя их при поиске в моей базе данных Mongodb. Затем я пытаюсь добавить это значение к объекту сдвига в моем массиве сдвигов. К сожалению, не похоже, что код проходит через раздел Q.all. Я не очень знаком с понятиями обещаний или Q, поэтому я не уверен, сделал ли я очень небрежную ошибку или нет.

dbFunctions.algorithm = function(collectionName, callback){
    var collection = dbConnection.collection(collectionName);

//order the shifts in order of number of volunteers
var shifts = [ { value : 'setup' }, { value : '8:30' }, { value : '9:00' }, { value : '9:30' }, { value : '10:00' }, { value : 'cleanup' } ];

var promiseList = [];
for(var i=0; i < shifts.length; i++) {
    promiseList[i] = Q.defer();
}

for ( var j=0; j<shifts.length; j++ ){
    var promise=promiseList[j];

    var shift = shifts[j];

    collection.find({ 'Available[]' : { $elemMatch : { $eq : shift.value } } }).toArray(function(err, result) {
         shift.count = result.length;
         promise.resolve();
    });

}  

console.log(promiseList);
console.log(_.map(promiseList,'promise'));
console.log("here1");
Q.all(_.map(promiseList,'promise')).then(function(value){
    console.log("here2");
    shifts.sort(function (value1, value2){
    return value1.count - value2.count;
    });
    console.log(shifts);

});


}

В разделе кода Q.all я пытаюсь отсортировать массив сдвигов на основе этих значений счетчика. Это сообщение, которое я получаю из console.log(_. Map(обещание, обещание));:

[ { state: 'pending' },
  { state: 'pending' },
  { state: 'pending' },
  { state: 'pending' },
  { state: 'pending' },
  { state: 'pending' } ]
here1

1 ответ

Похоже, что библиотека Q, используемая в вопросе, не является Promise/A+, поэтому неясно, почему код в Q.all(...).then по-видимому, работает "слишком рано"

изменение кода для использования нативного Promise (доступного в узле уже давно) приводит к следующему более понятному коду - который на самом деле работает!

dbFunctions.algorithm = function(collectionName, callback){
    var collection = dbConnection.collection(collectionName);

    var shifts = [ { value : 'setup' }, { value : '8:30' }, { value : '9:00' }, { value : '9:30' }, { value : '10:00' }, { value : 'cleanup' } ];

    Promise.all(shifts.map(function(shift) {
        return new Promise(function(resolve, reject) {
            collection.find({ 'Available[]' : { $elemMatch : { $eq : shift.value } } }).toArray(function(err, result) {
                shift.count = result.length;
                resolve();
            });
        });
    })).then(function(results) { // not actually used as the shifts array is updated directly
        shifts.sort(function (value1, value2){
            return value1.count - value2.count;
        });
        console.log(shifts);
    });
}
Другие вопросы по тегам