我有一些问题需要处理" parallel"中的多次拒绝。 当我们"并行等待时,如何处理异步函数中的拒绝。 这是一个例子:
function in_2_sec(number) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('Error ' + number);
}, 2000);
})
}
async function f1() {
try {
let a = in_2_sec(3);
let b = in_2_sec(30);
return await a + await b; // awaiting in "parallel"
} catch(err) {
console.log('Error', err);
return false;
}
}
async function f2() {
try {
let a = await Promise.all([in_2_sec(3), in_2_sec(30)]);
return a[0] + a[1];
} catch(err) {
console.log('Error', err);
return false;
}
}
// f1().then(console.log) // UnhandledPromiseRejectionWarning
// f2().then(console.log) // Nice
f1()
在节点中创建UnhandledPromiseRejectionWarning
,因为未处理第二次拒绝(b)。
f2()
完美无缺,Promise.all()
可以解决问题,但是如何在没有f2()
的情况下使用async / await语法创建Promise.all()
?
答案 0 :(得分:6)
f2()
效果很好,Promise.all()
可以解决这个问题,但是如何在没有f2()
的情况下使用async / await语法制作Promise.all()
?
完全没有。 使用Promise.all
!这就是它的用途。不要想到替换承诺的async
/ await
- 你仍在使用它们,它只是then
次呼叫的语法糖。 Promise.all
没有句法替代。
当然,也可以自己重新实现Promise.all
的行为(依赖于Promise
构造函数和.then
原语),但你真的没有&#39我想这样做(有太多的陷阱)。
答案 1 :(得分:3)
我能想到的最简单的事情,我不喜欢它,就是在错误路径中对catch
进行无条件调用,可能是实用函数。
使用这些实用功能:
function noop() {
}
function markHandled(...promises) {
promises.forEach(p => p && p.catch(noop));
}
它' S:
async function f2() {
let a, b;
try {
a = in_2_sec(3);
b = in_2_sec(30);
return await a + await b;
} catch(err) {
console.log('Error', err);
markHandled(a, b);
return false;
}
}
这样,我们明确地忽略了我们不关心的拒绝,并发现了主要错误。
示例:
function in_2_sec(number) {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('Error ' + number);
}, 2000);
})
}
function noop() {
}
function markHandled(...promises) {
promises.forEach(p => p && p.catch(noop));
}
async function f2() {
let a, b;
try {
a = in_2_sec(3);
b = in_2_sec(30);
return await a + await b;
} catch(err) {
console.log('Error', err);
markHandled(a, b);
return false;
}
}
f2().then(console.log);