2017-12-13 6 views
1

두 개의 쿼리 결과로 객체를 작성해야하지만 정의되지는 않습니다. 첫 번째 쿼리에서 반환 된 각 개체에서 두 번째 쿼리 목록을 설정해야합니다. 그러나 쿼리를 연결하는 결과로 중첩 된 일부 구현을 수행해야 할 때 약속을 사용하는 것이 어려워졌습니다.nodejs와의 약속을 사용하여 두 개의 중첩 된 쿼리에서 객체 반환

두 쿼리가 모두 작동하고 올바른 값을 반환합니다.

여기 내 문제는 일부 논리와 "자바 스크립트 및 약속을 사용하는 방법을 모르는"문제입니다.

var aFunction = function(){ 

     //this query return a list of A objects 

     return myDAO.getADataList() 
     .then(function(aDataList){ 

      aDataList.forEach(function(aData){ 

      //this query return a list of B objects to each A object 

      myDAO.getBdataFromA(aData.id) 
       .then(function(bDataList){ 

       //here i want to return a object with both values 

       return { 
        aValue: aData, 
        list : bDataList 
       } 
       }) 
      }) 
     }); 
     } 

     aFunction() 
      .then(function(data){ 
      //here data is undefined 
      console.log(data); 
     }); 

답변

0

사용할 수 Promise.all :

나는

내 코드 어떤 조언을 주셔서 감사합니다

return myDAO.getADataList() 
.then(function(aDataList){ 
    return Promise.all(
    aDataList.map(function (aData) { 
     //this query return a list of B objects to each A object 
     return myDAO.getBdataFromA(aData.id) 
     .then(function (bDataList) { 
      //here i want to return a object with both values 
      return { 
      aValue: aData, 
      list: bDataList 
      } 
     }) 
    }) 
); 
}); 
0

문제는 당신이 왜 두 번째 약속에 아무것도 반환되지 않습니다이다 당신은 정의되지 않습니다.

.then(function(aDataList){ 
    aDataList.forEach(function(aData){ 
     myDAO.getBdataFromA(aData.id) 

myDAO.getBdataFromA에서 결과를 통합하여 값을 반환해야이 문제를 해결합니다. Array.mapPromise.all을 사용하면됩니다.

a var aFunction = function(){ 
//this query return a list of A objects 
return myDAO.getADataList() 
    .then(function(aDataList){ 
    var getaDataListPromises = aDataList.map(myDAO.getBdataFromA(aData.id) 
    .then(function(bDataList){ 
     //here i want to return a object with both values 
     return { 
     aValue: aData, 
     list : bDataList 
     } 
    })); 
    return Promise.all(getaDataListPromises); 
    }); 
}