我标志着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}代替(需要Promise.all)承诺,是导致异步集团永远不会执行/评估。
我的新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));
};
这只是嵌套的承诺,地图和结构对象的混合使我困惑。 谢谢!
是'getData1()','getData2()'和'getData3()'异步操作?如果是这样,那么他们应该返回一个在异步操作完成时用他们的结果解决的承诺。还好奇你为什么使用带有'data0.map()'和'data1.map()'的'Promise.all()',而不是'data2.map()'。如果它们不是异步操作,那么就不需要对它们使用'Promise.all()'。实际上,您可以将所有顺序同步代码组合到一个'.then()'处理程序中。 – jfriend00
如果您向我们展示您的实际代码(而非伪代码),并且我们帮助您解决问题,而不是要求我们编写可能会或可能不会教您实际需要的示例,则Stackoverflow会更好。因此,请向我们展示'getData1()','getData2()'和'getData3()'的实际代码,您可能会获得非常有用的帮助。 – jfriend00
我意识到这一点,但有时在发布代码片段之前,先澄清概念会更容易。德鲁夫的回答解释了我不确定的不同概念。另外,我添加了一个答案来总结解决方案。 – Hochman7G