【发布时间】:2017-09-19 23:59:08
【问题描述】:
我有一些问题需要以“并行”方式处理多个拒绝。
当我们“并行等待”时如何处理异步函数中的拒绝。
这里是一个例子:
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() 可以解决问题,但是如何使用仅 async/await 语法而不使用 Promise.all() 来制作 f2()?
【问题讨论】:
-
await"等待承诺解决"。在f1中,您正在等待每个承诺独立解决,因为您使用了两次await。由于您根本不处理它们,因此行为是合乎逻辑的。 -
@Sebas:确实。我认为问题是如何优雅地处理这种逻辑行为...... :-)
-
@Sebas 确定这是完全合乎逻辑的,并且作为 T.J.克劳德说这个问题即将在没有
Promise.all()的情况下处理这种行为。 -
哇,这个问题真的让我陷入了一个循环,直到我意识到第二个
await根本没有执行。
标签: javascript node.js asynchronous async-await