我试图让嵌套的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)是以异步方式获得的吗?
谢谢!
答案 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));
};
它只是混淆了我的嵌套承诺,地图和结构对象的组合。 谢谢!