【发布时间】:2019-12-14 09:03:50
【问题描述】:
我很确定我过于复杂了,因此非常感谢您的帮助!
我有一个包含几个慢速方法的类。所以我使用 Promise 来按顺序使用方法而不使用回调。
其中一个方法返回一个数据数组;有必要遍历这个数组并对每个值执行不同的方法。为了做到这一点,我使用了 Promise.all()。问题是这个循环在原始承诺链移动到列表中的下一个 .then() 之前没有完成。
类:
class worker {
slowFunctionOne(list) {
return new Promise(function(resolve, reject) {
for ( var i in list ) {
list[i] = ( list[i] * 2 );
}
setTimeout(() => resolve(list), 1000);
});
}
slowFunctionTwo(number) {
return new Promise(function(resolve, reject) {
number = ( number / 2 );
setTimeout(() => resolve(number), 1000);
});
}
}
module.exports = worker;
主要:
const worker = require('./worker');
var w = new worker();
var list = [2,4,6,8,10];
var promises = [];
w.slowFunctionOne(list)
.then(function(value) {
console.log("After first method:",value);
for ( i in value ) {
promises.push(w.slowFunctionTwo(value[i]));
}
var output = [];
Promise.all(promises)
.then(function(number) {
console.log("After second method:",number);
output = number;
});
return output;
})
.then(function(val) {
console.log("Finally:",val);
});
输出:
After first method: [ 4, 8, 12, 16, 20 ]
Finally: []
After second method: [ 2, 4, 6, 8, 10 ]
所以你可以看到 slowFunctionOne() 运行并返回一个数组。然后它遍历该数组并对每个值执行 slowFunctionTwo()。我的意图是在 Promise.all() 完成后,将所有来自 slowFunctionTwo() 的修改值放入“输出”变量中;最后它应该转到原始链中的最后一个 .then() 并回显“输出”。
如您所见,最后一个 .then() 中的代码在 Promise.all() 完成之前执行。
那么我如何让最终的 .then() 等到嵌套的 Promise 链中的所有内容都完成?我怀疑 async/await 是正确的答案,但我不知道如何在不搞砸顶级链的情况下将其用于嵌套部分。
【问题讨论】: