【发布时间】:2018-01-09 23:52:31
【问题描述】:
我正在尝试让嵌套的 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));
};
附注: 1. getData0 到 getData1 返回结构(例如 { a: val1, b: val2 }) 2. 我认为问题出在 getData 的编写方式上。我怀疑他们应该回报承诺。谁能给我一个关于返回结构的函数的虚拟示例,其中(参见上面的 a 和 b)的两个元素都是以异步方式获得的?
谢谢!
【问题讨论】:
-
getData1()、getData2()和getData3()是异步操作吗?如果是这样,他们应该在异步操作完成时返回一个用结果解决的承诺。也很好奇为什么你将Promise.all()与data0.map()和data1.map()一起使用,而不是与data2.map()一起使用。如果它们不是异步操作,那么没有必要对它们使用Promise.all()。实际上,您可以将所有顺序同步代码合并到一个.then()处理程序中。 -
如果你向我们展示你的实际代码(不是伪代码),Stackoverflow 会更好地工作,我们会帮助你修复它,而不是你要求我们编写可能会或可能不会教你实际需要的示例。因此,请向我们展示
getData1()、getData2()和getData3()的实际代码,您可能会得到非常有用和具体的帮助。 -
我知道这一点,但有时在发布代码 sn-p 之前先弄清概念会更容易。 Dhruv 的回复解释了我不确定的不同概念。另外,我添加了一个答案来总结解决方案。
-
没有。如果您包含实际代码,堆栈溢出会更好地工作 - 总是。如果没有您的实际代码,我们只能猜测如何最好地回答对您而言真正重要的问题。而且,通过您的实际代码,我们有机会向您展示更好的方法来做您自己不会想到的事情,甚至可能不知道要问什么。所以,最好“先搞清楚概念”。最好在实际代码的确切上下文中阐明概念。我用代码和概念解释发布答案。
-
当然是Kentoj
标签: javascript node.js promise nested es6-promise