복붙노트

[MONGODB] DB에서 검색 한 데이터를 반환의 문제는 루프에서 호출 쿼리하여

MONGODB

DB에서 검색 한 데이터를 반환의 문제는 루프에서 호출 쿼리하여

나는 루프에서 여러 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. ==============================

    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 적용 할 수있는 배열로 아무것도 할 필요합니다.

  2. 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