我有一个函数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
并在c.then
内解决它。
问题:除了使代码混乱之外,还有一个额外的承诺。
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
没有语义上的理由,这个解决方案让我想起了预先承诺的回调疯狂。
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
});
});
你必须从.then
回调中返回一些东西。如果你想继续等待别的东西,要么是价值(然后是承诺被认为已经解决),要么是另一个承诺。
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => {
return requestJSON(/* [3] */);
})
];
// this waits for [1] and [3]
promises.all(promises).then(results => {
console.log(data.length);
});
你的代码没有从.then()
返回任何内容。所以函数返回值是undefined
,并且使用undefined
作为结果确定了promise。
以上内容可以写成(注意箭头函数中没有完整体的隐式return
):
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => requestJSON(/* [3] */))
];
promises.all(promises).then(results => console.log(data.length));