如何在JavaScript Promise.all()中使用async/await语法忽略错误

2nbm6dog  于 2023-01-11  发布在  Java
关注(0)|答案(3)|浏览(122)

我正在尝试运行一个for循环,它将一堆异步请求排队。一旦所有请求都完成,不管它们是resolve还是reject,我都想运行一些代码。我正在尝试利用async/await模式,因为它看起来更好。:)
这是我正在做的事情:

var promises = []
for ( item in list ) {
    prom = AsyncFunction( item )
    promises.push(prom)
}

await Promise.all(promises)

doMoreAfter()

然而,一些承诺失败了,第二个发生的Promise.all()也失败了。
我只想忽略任何失败的承诺,并在所有承诺完成后运行下一个代码。
我找到了这样的解决方案。

Promise.all([a(), b(), c()].map(p => p.catch(e => e)))
  .then(results => console.log(results)) // 1,Error: 2,3
  .catch(e => console.log(e));

但是当试图将其转换为async/await格式时,它看起来不起作用。

await Promise.all(promises.map(p => p.catch(e => e)))

我错过了什么?

3bygqnnd

3bygqnnd1#

我觉得你能做的就是:

var promises = [a, b, c];
promises = promises.map(p => p().catch(e => undefined));

values = await Promise.all(promises);
console.log(values);  // ["a", undefined, "c"]

https://jsfiddle.net/DerekL/h5Lmxaqq/
也可以创建一个ignore函数:

function ignore(promise){
    return promise.catch(e => undefined);
}

async function main(){
    var promises = [a(), b(), c()];

    var values = await Promise.all(promises.map(ignore));
    console.log(values);
}

https://jsfiddle.net/DerekL/mwkww7w9/

lnxxn5zx

lnxxn5zx2#

我试着这样运行你的例子:https://jsfiddle.net/804ogadu/3/

var a = Promise.resolve('a');
var b = Promise.resolve('b')
var c = Promise.reject('errc');

async function test(){
const t = await Promise.all([a, b, c].map(p => p.catch(e => e)));
console.log(t);
}

test();

我确实得到了所需的结果

['a,'b','errc']
vvppvyoh

vvppvyoh3#

您是否考虑过使用Promise.allSettled()?(https://developer.mozilla.org/en-US/docs/Web/JavaScript/参考/全局对象/承诺/所有已解决#using_promise. allsettled)

相关问题