2014-11-20 3 views
0

일부 데이터를 Mssql 서버에서 가져 오려고합니다. 루프가있는 함수가 있습니다. 이 함수는 일부 데이터를 콜백에 반환했습니다. kriskowal의 "q"데이터를 resultset 변수에 넣을 수 있습니까?루프 내에서 "q"사용

기능 pet.getNameByIDadress.getNameByID은에 콜백 데이터를 반환!

도움 주셔서 감사합니다. 일부 지점에서

인사말 닐스

exports.get = function(callback) { 
edge.func("sql", { 
    source: 'SELECT * FROM people' 
})(null, function(error, result) { 
    if (error) { 
     throw (error) 
    } 

    if (result) { 

     var resultset = [] 

     for (var i in result) { 

      var row = result[i]; 

      q.all([ 
       // get pet name 
       q.fcall(function() { 
        var deferred = q.defer(); 
        pet.getNameByID({ 
         id: 32155 
        }, function(data) { 
         deferred.resolve(data); 
        }); 
        return deferred.promise; 
       }), 
       // get adress 
       q.fcall(function() { 
        var deferred = q.defer(); 
        adress.getNameByID({ 
         id: 23 
        }, function(data) { 
         deferred.resolve(data); 
        }); 
        return deferred.promise; 
       }), 
      ]).spread(function(resultPet, resultAdress) { 

       // Data!!!! 
       return { 
        petData: resultPet, 
        adressData: resultAdress 
       }; 

      }); 

      resultset.push(/* How can i push the data return from spread() into the resultset array? */) 
     } 

     callback(resultset); 
    } 
}); 
}); 
+0

다른'Q.all'을 사용하지 않는 이유는 무엇입니까? – Bergi

+0

"for (var ..."다음에 두 번째 행의 q.all을 사용하거나 더 좋은 해결책이 있습니까? – poldixd

답변

0

귀하의 구조는 여전히 동기 방식처럼 보인다. 나는 아래의 변경하려고 :뿐만 아니라 비동기이며 그와 동등하게 취급해야합니다

exports.get = function(callback) { 
edge.func("sql", { 
    source: 'SELECT * FROM people' 
})(null, function(error, result) { 
    if (error) { 
     throw error; 
     return; 
    } 

    if (result) { 

     var subresults = []; 

     for (var i=0; i<result.length; i++) { 

      var row = result[i]; 

      // defers for the results of the subqueries 
      var petResult = q.defer(), 
       adressResult = q.defer(); 

      // 1st subquery 
      pet.getNameByID({ 
       id: 32155 
      }, function(data) { 
       petResult.resolve(data); 
      }); 

      // 2nd subquery 
      adress.getNameByID({ 
       id: 23 
      }, function(data) { 
       adressResult.resolve(data); 
      }); 

      // collect both subquerys and add a promise for 
      var subqueries = q.all(petResult.promise, adressResult.promise) 
           .then(function(pet, adress){ 
            return { 
            petData: pet, 
            adressData: adress 
            } 
           }, function(e){ 
            return e 
           }); 

      // collect all subresults 
      subresults.push(subqueries); 
     } 

     // when all queries are resolved 
     q.all(subresults) 
     .then(function(){ 
      // all results will be in the arguments array here 
      callback(arguments); 
     }, function(e) { 
      // some error handling 
     }); 

    } 
}); 
}); 

통화 adress.getNameByID()에와 pet.getNameByID(). 그래서 내 코드에서 그 하위 쿼리에 대한 결과를 얻고이를 새로운 지연/약속과 결합합니다. 모든 하위 쿼리 약속이 채워지면 각 결과와 함께 주 콜백을 실행할 수 있습니다.

+0

For ... in 루프를 사용하여 배열을 반복하는 이유는 무엇입니까? –

+0

@BenjaminGruenbaum 양쪽 OPs 코드 중 일부는 바뀌지 않았습니다. – Sirko