【发布时间】:2017-12-20 00:37:02
【问题描述】:
我有一个函数 requestJSON 查询外部 API 并返回一个(蓝鸟)承诺。
问题: b 在c 添加到列表之前得到解决,因此promise.all 运行而只有a 和b 得到解决。
代码:
let promises = [];
// push promise a
promises.push(requestJSON(..));
// push promise b
promises.push(requestJSON(..).then((response) {
// push promise c
promises.push(requestJSON({foo: response.bar});
});
promises.all((data) => {
console.log(data.length) // --> 2
});
问题: 对于这个问题,我想不出一个真正令人满意的解决方案。是否有节点方式/最佳实践?
可能的解决方案
(I) 将 b 包装在另一个 Promise 中,并在 c.then 中解决它。
问题:一个额外的 Promise 除了使代码混乱之外实际上并没有多大作用。 p>
let promises = [];
// push promise a
promises.push(requestJSON(..));
// push helper promise
promises.push(new Promise((resolve, reject) => {
// push promise b
promises.push(requestJSON(..).then((response) {
// push promise c
promises.push(requestJSON({foo: response.bar});
// resolve helper promise
resolve();
}).catch(..);
}));
promises.all((data) => {
console.log(data.length) // --> 4
});
(II) 将所有内容放入 b.then。
问题: 将 a 和 promise.all 放入 b 中没有语义上的理由 + 该解决方案让我想起了前-promise 回调疯狂。
let promises = [];
// push promise b
promises.push(requestJSON(..).then((response) {
// push promise a
promises.push(requestJSON(..));
// push promise c
promises.push(requestJSON({foo: response.bar});
promises.all((data) => {
console.log(data.length) // --> 3
});
});
【问题讨论】: