【发布时间】:2017-05-25 19:50:10
【问题描述】:
我需要链接使用请求承诺的承诺,所以它有点链接嵌套的承诺。
想象一下代码:
const rp = require('request-promise');
function doStuff(){
for ( let i = 0; i <= 10; i++ ){
methodA();
}
};
function methodA(){
let options = {...};
rp(options)
.then(result => methodB(result))
.catch(err => console.log(err));
};
function methodB(resultA){
let options = {uri: resultA};
rp(options)
.then(result => methodC(resultA, result))
.catch(err => console.log(err));
};
function methodC(resultA, resultB){
//some calculations
};
在 doStuff 中,我需要等待方法 C 的所有十次执行的结果并将它们收集到数组中。我试过这样链接它:
function doStuff(){
for ( let i = 0; i <= 10; i++ ){
let promiseA = new Promise((resolve, reject) => {
resolve(methodA());
});
let promiseB = promiseA.then(result => methodB(result));
let promiseC = promiseB.then(result => methodC(promiseA.result, result));
Promise.all([promiseA, promiseB, promiseC]);
}
};
但它肯定行不通,因为在 methodA 和 methodB 中我们有异步的 HTTP 请求。因此,promiseB 中的结果是未定义的。
这意味着,问题是:如何链接承诺,如果它们有嵌套的承诺?(以及最终如何收集结果?)
谢谢!
更新:链接承诺也没有多大帮助,因为 1 返回 AB 的先前数组,但期望的结果反之亦然:
function methodA(){
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Resolved A');
resolve('A');
}, Math.random() * 2000);
});
return promise
.then(result => methodB(result))
.catch(err => console.log(err));
}
function methodB(resultA){
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Resolved B');
resolve('B');
}, Math.random() * 2000);
});
return promise
.then(result => methodC(resultA, result))
.catch(err => console.log(err));
}
function methodC(resultA, resultB){
return resultA + resultB;
}
function doStuff() {
let promises = [];
for (let i = 0; i <= 10; i++){
promises.push(methodA());
}
Promise.all(promises).then(results => {
console.log(results);
});
return 1;
}
console.log(doStuff());
【问题讨论】:
-
绝对不是重复的。那里的承诺不相互依赖。
标签: javascript node.js promise request-promise