Выполнение множества обещаний с 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);
});
}