[MONGODB] DB에서 검색 한 데이터를 반환의 문제는 루프에서 호출 쿼리하여
MONGODBDB에서 검색 한 데이터를 반환의 문제는 루프에서 호출 쿼리하여
나는 루프에서 여러 MongoDB의 쿼리를 만드는. 하나 개의 데이터가 array.But로 모든 결과를 보낼 때 간단한 사용 전송에 대한 반환은 데이터를 단순히 정의되지 않은 반환 모든 DB 요청의 결과를 기다리지 않는다. 또한 사용 q.moulde하지만 같은 문제로했습니다.
암호:
var getPrayerInCat = function(data){
var result ;
var finalData = [];
if(data.length >0){
data.forEach(function(data2){
var id= data2.id;
Prayer.find({prayerCat:id},function(err,prayer){
var deferred = Q.defer()
if (err) { // ...
console.log('An error has occurred');
// res.send(err);
result= finalData = err
} else {
if(!prayer){
// console.log(data2.id+'--0');
data2.prayersCount = 0;
result = deferred.resolve(finalData.push(data2))
} else {
// console.log(data2.id+'--'+prayer.length);
data2.prayersCount = prayer.length;
// console.log(prayer)
result = deferred.resolve(finalData.push(data2))
} // else for data forward
}
deferred.promise;
})
// deferred.resolve(finalData);
})
/*if(finalData.length > 0) { return finalData;}*/
}
}
FinalData를 정의되지 않은 반환됩니다.
해결법
-
==============================
1.의이 약속을 사용하는 일반적인 규칙으로 시작하자 :
의이 약속을 사용하는 일반적인 규칙으로 시작하자 :
귀하의 경우이 어떤 기능인가요? 그것은 getPrayerInCat, foreach는 콜백 및 Prayer.find입니다.
흠, Prayer.find는 약속을 반환하지 않습니다, 우리는 그것을 수정할 수 있도록 도서관 기능입니다. 규칙 2가 활동하기 시작 :
Q의 노드 인터페이스 도우미로 쉽게 우리의 경우 :
var find = Q.nbind(Prayer.find, Prayer);
이제 우리는 주위에 약속이없는 등 어떤 deferreds 필요없는 않습니다. 세 번째 규칙은 놀이로 온다 :
... 반환 결과. "뭔가"비동기 있다면 지옥, 그 결과는도 약속을 할 수 있습니다! 이와 함께, 우리는 완전한 콜백 함수를 작성할 수 있습니다 :
function getPrayerCount(data2) { var id = data2.id; return find({prayerCat:id}) // ^^^^^^ Rule 1 .then(function(prayer) { // ^^^^^ Rule 3 if (!prayer) data2.prayersCount = 0; else data2.prayersCount = prayer.length; return data2; // ^^^^^^ Rule 3b }); }
루프 : 이제, 우리는 조금 더 복잡 뭔가가있다. 반복 getPrayerCount ()는 우리에게 누구의 비동기 작업을 알 수없는 순서로 병렬 및 해결에 실행되는 여러 약속을 얻을 것이다 호출. 즉 모든 결과에 결의가 각 작업이 완료되었음을 약속을 얻을 - 우리는 그들 모두를 기다려야합니다.
같은 복잡한 작업을 위해, 자신의 해결책을 마련하려고하지 않습니다
그리고 우리는 정확히이 일을 Q.all을,이 찾을 수 있습니다. 쓰기 getPrayerInCat 지금은 바람이다 :
function getPrayerInCat(data) { var promises = data.map(getPrayerCount); // don't use forEach, we get something back return Q.all(promises); // ^^^^^^ Rule 1 }
우리는 Q.all 해결되는, 그냥 규칙 3 적용 할 수있는 배열로 아무것도 할 필요합니다.
from https://stackoverflow.com/questions/25751723/issue-in-returning-data-retrieved-from-db-queries-called-in-the-loop by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 정지 몽구스 하위 문서 배열 항목에 대한 _id 속성을 생성에서 (0) | 2019.11.30 |
---|---|
[MONGODB] MongoDB의 몽구스의 E11000 중복 키 에러 인덱스 (0) | 2019.11.30 |
[MONGODB] 어떻게 MongoDB의 컬렉션에서 모든 문서를 하나의 필드를 선택하려면? (0) | 2019.11.30 |
[MONGODB] MongoDB를는 : 배열의 항목 수를 카운트 (0) | 2019.11.30 |
[MONGODB] 몽구스는 항상 빈 배열 NodeJS를 반환 (0) | 2019.11.30 |