gpt4 book ai didi

javascript - 在解决之前等待 Promise.all 中的 promise 完成

转载 作者:行者123 更新时间:2023-11-30 08:27:24 25 4
gpt4 key购买 nike

我有一个 Promise.all,如果它不为空,它会执行映射到数组输入上的异步函数,然后将数据解析为先前定义的 Promise:

Promise.all((inputs || []).map(input => {
return new Promise((resolve, reject) => {
someAsyncFunc(input)
.then(intermediateOutput => {
someOtherAsyncFunc(intermediateOutput )
.then(output => {
return Promise.resolve(output )
})
.catch(reason=> {
return Promise.reject(reason)
})
})
.catch(reason => {
return Promise.reject(reason);
})
})
.then(outputs => {
resolve(outputs)
})
.catch(reason => {
reject(reason)
})
}))

在 someAsyncFunc 完成其工作之前,我只得到空输出。如何让 Promise.all 等待里面的 promise 完成他们的异步工作?

最佳答案

不只是

return Promise.all((inputs || []).map(input =>
somePromiseFunc(input).then(someOtherPromiseFunc)
);

工作?

你不是第一次使用 Promise.all ,因为它需要一个 promise 数组作为输入,而不是 (resolve, reject) => { ... }/

Promise.all 将在其中一个底层 promise 失败后立即被拒绝,因此您无需尝试围绕 catch(error => reject(错误)

例子:

const somePromiseFunc = (input) => new Promise((resolve, reject) => {
setTimeout(() => {
if (input === 0) { reject(new Error('input is 0')); }
resolve(input + 1);
}, 1000);
});

const someOtherPromiseFunc = (intermediateOutput) => new Promise((resolve, reject) => {
setTimeout(() => {
if (intermediateOutput === 0) { reject(new Error('intermediateOutput is 0')); }
resolve(intermediateOutput + 1);
}, 1000);
});

const f = inputs => {
const t0 = Date.now()
return Promise.all((inputs || []).map(input => somePromiseFunc(input).then(someOtherPromiseFunc)))
.then(res => console.log(`result: ${JSON.stringify(res)} (after ${Date.now() - t0}ms)`))
.catch(e => console.log(`error: ${e} (after ${Date.now() - t0}ms)`));
};

f(null)
// result: [] (after 0ms)

f([1, 0])
// error: Error: input is 0 (after 1001ms)

f([1, -1])
// error: Error: intermediateOutput is 0 (after 2002ms)

f([1, 2])
// result: [3,4] (after 2002ms)

关于javascript - 在解决之前等待 Promise.all 中的 promise 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43401703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com