node.js + 蓝鸟:解析 promise.all
node.js + bluebird: resolving promise.all
我有一个函数 requestJSON
查询外部 API 和 returns 一个 (bluebird) 承诺。
问题: 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,除了使代码混乱之外并没有多大作用。
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
});
});
您必须 return 来自 .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);
});
您的代码没有 return 来自 .then()
的任何内容。所以函数 return 的值是 undefined
并且承诺以 undefined
作为结果。
上面可以写成(注意箭头函数中隐含的return
,没有完整的函数体):
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => requestJSON(/* [3] */))
];
promises.all(promises).then(results => console.log(data.length));
我有一个函数 requestJSON
查询外部 API 和 returns 一个 (bluebird) 承诺。
问题: 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,除了使代码混乱之外并没有多大作用。
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
});
});
您必须 return 来自 .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);
});
您的代码没有 return 来自 .then()
的任何内容。所以函数 return 的值是 undefined
并且承诺以 undefined
作为结果。
上面可以写成(注意箭头函数中隐含的return
,没有完整的函数体):
let promises = [
requestJSON(/* [1] */),
requestJSON(/* [2] */).then(response => requestJSON(/* [3] */))
];
promises.all(promises).then(results => console.log(data.length));