Node JS嵌套Promise.all并且映射逻辑不起作用

时间:2017-08-02 16:24:46

标签: javascript node.js promise nested es6-promise

我试图让嵌套的Promise.all *地图逻辑起作用。当我到达getData2时,我一直得到未定义的值。

exports.getData = (param1, param2) => {
  return getData0(param1, param2)
    .then(data0 => Promise.all(data0.map(e => getData1(e.id))))
    .then(data1 => Promise.all(data1.map(i => getData2(i.id))))
    .then(data2 => data2.map(a => getData3(a.id)))
    .catch(err => console.error(err.message));
};

P.S: 1. getData0到getData1返回结构(例如{a:val1,b:val2}) 我认为问题在于写入getData的方式。我怀疑他们应该回报承诺。任何人都可以给我一个关于函数的虚拟示例,该函数返回一个结构,其中两个元素(参见上面的a和b)是以异步方式获得的吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

首先,如果所有Where方法正在执行任何异步操作,则它们应返回WHERE个对象。 (例如用于获取数据)。

getData*可能是一个例外,因为在完成所有Promise调用后,它看起来不需要做任何事情。 如果情况并非如此,您可以使用与getData3类似的方法。 例如getData3

现在让我们逐行查看代码

getData3

至于data2 => Promise.all(data2.map(a => getData3(a.id))) 我相信这应该回答How to use Promise.all with an object as input

答案 1 :(得分:0)

我将Dhruv的答案标记为有效的答案,因为它解释了我所描述的逻辑中涉及的不同概念。

getData1和getData2确实调用异步函数(在我的情况下:下面是doSomeEWSwork),而getData3是同步的。

function doSomeEWSwork(param) {

  var ewsFunction = '.....';
  var ewsArgs = ....;

  return ews.run(ewsFunction, ewsArgs)
    .then(result => result.something)
    .catch(err => console.log(err.message));
}

我的旧getData1和getData2用于返回结构对象(例如{a:val1,b:val2}而不是promises(Promise.all所需)。这导致async blocs永远不会执行/计算。

我的新getData1和getData2具有以下骨架:

function getData1_or_2(param) {

  var promise = new Promise(function(resolve, reject) {
    doSomeEWSwork(param) // <- important: settle this using 'then'
    .then(res => {
      var ret = { a: res.val1, b: res.val2 };
      resolve(ret);
    }).catch(err => {
      console.log(err.message);
      reject(Error(err.message));
    });
  });
  return promise;
}

所以主要方法(已包含在我的原始问题中)现在可以正常工作,因为我正在返回异步和对象同步的承诺。

exports.getData = (param1, param2) => {
  return getData0(param1, param2)
    .then(data0 => Promise.all(data0.map(e => getData1(e.id))))
    .then(data1 => Promise.all(data1.map(i => getData2(i.id))))
    .then(data2 => data2.map(a => getData3(a.id)))
    .catch(err => console.error(err.message));
};

它只是混淆了我的嵌套承诺,地图和结构对象的组合。 谢谢!