2017-01-19 3 views
0

Mongodb 데이터베이스에서 검색 할 때 각 교대에 할당 된 개인 수를 계산하려고합니다. 그런 다음 교대 배열 내의 해당 교대 객체에 해당 값을 추가하려고합니다. 불행히도, 코드가 Q.all 섹션을 통해 진행되고있는 것 같지 않습니다. 저는 약속이나 Q의 개념에 익숙하지 않아 매우 부주의 한 오류를 범했는지 확신 할 수 없습니다.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 (promiseList, 'promise')); :

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

Q.all (_. map (promiseList, 'promise'))'를'Q.all (promiseList) '로 변경하면 더 잘 작동합니까? –

+0

내가 할 때 그것은 코드의 전체 섹션을 거칩니다. 그러나 다음과 같이 출력됩니다 : here2 [{value : 'setup'}, {value : '8:30'}, {value : '9:00'}, {value : '9:30' }, {값 : '10 : 00 '}, {값 :'정리 '}] – user7438390

+0

카운트가 저장되지 않고 배열이 정렬되지 않습니다. – user7438390

답변

0

이 질문에 사용 된 Q 라이브러리는 약속/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); 
    }); 
}