解决向上传播多个调用异步函数的问题
Resolves propagating up multiple calling async functions
我一直在尝试让我的异步函数的 reject
冒泡回到它们的调用者,但由于某种原因它不起作用。这是一些经过测试的示例代码:
"use strict";
class Test {
constructor() {
this.do1();
}
async do1() {
try { this.do2(); } catch(reason) { console.error(reason); }
}
async do2() {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
}
async do3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(Math.random() < 0.3) reject('###rejected');
else resolve("###success");
}, 1000);
});
}
}
export default Test;
Chrome 每次都给我这个:Unhandled promise rejection ###rejected
.
知道为什么会这样吗?我希望能够从比 do2()
更高的级别处理所有抛出的错误(如果 try/catch 在 do2()
中并包装 await this.do3();
,则上面的示例工作正常) .谢谢!
编辑: 更明确一点,如果我从 do1()
中取出 try/catch 并将其放入 do2()
作为如下,一切正常:
async do2() {
try {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
} catch(reason) { console.error(reason); }
}
async do1() {
try {
await this.do2();
}
catch(reason) {
console.error(reason);
}
}
do2
是一个异步函数。并且您在没有 await
的情况下调用它。所以,当它完成时,周围没有 try-catch 子句。
有关详细信息,请参阅 this question and this article。
我一直在尝试让我的异步函数的 reject
冒泡回到它们的调用者,但由于某种原因它不起作用。这是一些经过测试的示例代码:
"use strict";
class Test {
constructor() {
this.do1();
}
async do1() {
try { this.do2(); } catch(reason) { console.error(reason); }
}
async do2() {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
}
async do3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(Math.random() < 0.3) reject('###rejected');
else resolve("###success");
}, 1000);
});
}
}
export default Test;
Chrome 每次都给我这个:Unhandled promise rejection ###rejected
.
知道为什么会这样吗?我希望能够从比 do2()
更高的级别处理所有抛出的错误(如果 try/catch 在 do2()
中并包装 await this.do3();
,则上面的示例工作正常) .谢谢!
编辑: 更明确一点,如果我从 do1()
中取出 try/catch 并将其放入 do2()
作为如下,一切正常:
async do2() {
try {
for(let i = 0; i < 10; i++) {
await this.do3();
console.log(`completed ${i}`);
}
console.log("finished do1");
} catch(reason) { console.error(reason); }
}
async do1() {
try {
await this.do2();
}
catch(reason) {
console.error(reason);
}
}
do2
是一个异步函数。并且您在没有 await
的情况下调用它。所以,当它完成时,周围没有 try-catch 子句。
有关详细信息,请参阅 this question and this article。