当你需要将结果附加到位于函数范围顶层的数组时,链接某些东西的正确方法是什么?
function run() {
let array = []
let input = 'object'
promiseA(input)
.then((result) => {
array.push(result)
})
promiseB(input)
.then((result) => {
array.push(result)
})
console.log(array.join(' '))
}
订单对我的申请无关紧要,如果认为是最佳实践,我可以将其并行化。它实际上只是检查一个条件,没有异步调用来从API或类似的东西中获取结果。
答案 0 :(得分:2)
您应该使用Promise.all等待承诺A并承诺B完成。 Promise.all将收到一系列结果(来自每个Promise),然后您可以使用它们。
你可能有类似的东西:
var promiseA = doSomethingThatReturnsPromise(input);
var promiseB = doSomethingThatReturnsPromise(anotherInput);
Promise.all([promiseA, promiseB]).then(function(resultsArray) { // do something });
答案 1 :(得分:2)
你的功能看起来像这样
function run () {
return Promise.all([promiseA(), promiseB()]).then(([resultA, resultB])=>{ })
}
答案 2 :(得分:1)
另一种方法是使用async
功能:
这种方法逐个执行承诺,这样你就能用所需的执行顺序处理结果。
function promiseA(input) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(input);
}, 1000);
});
}
function promiseB(input) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(input);
}, 500);
});
}
async function run() {
let array = [];
let input = 'Ele';
array.push(await promiseA(input));
input = "from SO";
array.push(await promiseB(input));
console.log(array.join(' '))
}
console.log('Wait for 1.5sec...')
run()
答案 3 :(得分:0)
回答问题
这是对Promises进行排序或链接的正确方法:
one(arr).then(two).then(log, fail);
这直接回答了问题,但没有提供其他可能的解决方案。
请注意,没有副作用。绝对避免在评论中提到的“范围”问题。
示例代码段实现了这个:
let arr = [];
function one(arr) {
return new Promise((res, rej) => {
arr.push('one');
res(arr);
});
}
function two(arr) {
return new Promise((res, rej) => {
arr.push('two');
res(arr);
});
}
function log(arr){
console.log(arr);
}
function fail(reason){
console.log(reason);
}
one(arr).then(two).then(log, fail);