使用带有nodejs的promises从两个嵌套查询中返回一个对象

时间:2017-12-13 02:35:10

标签: javascript node.js nested

我需要从两个查询的结果中构建一个对象,但我未定义。从第一个查询返回的每个对象,我需要设置一个带有第二个查询的列表。但是当我需要使用链接查询的结果嵌套实现时,我很难使用promises。

两个查询都正常工作并返回正确的值。

我的问题涉及一些逻辑和不知道如何使用javascript和promises"的问题。

我感谢任何提示

我的代码:

 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);
        });

2 个答案:

答案 0 :(得分: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
          }
        })
    })
  );
});

答案 1 :(得分: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);
  });
}