我一直在使用异步/等待6个月并且一直喜欢语法糖.我通常以传统的方式使用它:
try {
await doSomethingAsync()
}
catch (e) {}
最近我开始尝试不等待,以便在等待异步数据之前在此上下文中运行一些额外的代码,例如:
let p = doSometiongAsync()
... do more stuff
await p;
要么:
let p1 = doJob1();
let p2 = doJob2();
... do more synchronous stuff ...
await p1;
await p2;
问题是,try / catch块的正确位置在哪里,以确保正确捕获调用中的错误(同步或异步).它是在初始函数调用周围:
try {
let p = doSomethingAsync()
} catch(errors) {}
... do stuff ...
await p
或尝试阻止等待…或两个不同的尝试块,每个一个?
try {
let p = doSomethingAsync()
} catch(errors) {}
... do stuff
try {
await p;
} catch (evenmoreerrors) {}
谢谢!
解决方法:
这取决于doSomethingAsync是什么:异步函数或返回promise的非异步函数.
如果它是异步功能
…你只需要等待的尝试/捕获;异步函数永远不会同步抛出(即使它的初始同步部分抛出异常).
例:
async function foo() {
// Note this is in the synchronous portion
console.log("synchronous part of foo");
if (true) {
throw new Error();
}
return new Promise(resolve => {
resolve();
});
}
(async () => {
const p = foo(); // No uncaught error
try {
await p;
} catch (e) {
console.log("Caught the error");
}
})().catch(e => {
console.log("Failed to catch it!");
});
如果它是一个返回promise的非异步函数
…然后根据功能的不同,您可能需要在两个地方尝试/捕获,具体取决于它的编写方式.如果它可能抛出同步代码,你需要尝试/ catch.如果承诺拒绝,你需要尝试/捕捉等待.
不处理同步部分的示例:
function foo() {
// Note this is in the synchronous portion
console.log("synchronous part of foo");
if (true) {
throw new Error();
}
return new Promise(resolve => {
resolve();
});
}
(async () => {
const p = foo(); // No uncaught error
try {
await p;
} catch (e) {
console.log("Caught the error");
}
})().catch(e => {
console.log("Failed to catch it!");
});
未能捕获承诺拒绝的示例:
function foo() {
// Note this is in the synchronous portion
console.log("synchronous part of foo");
return new Promise((resolve, reject) => {
reject();
});
}
(async () => {
try {
const p = foo();
} catch (e) {
console.log("Caught the error");
}
await p;
})().catch(e => {
console.log("Failed to catch it!");
});
原文地址:https://codeday.me/bug/20190828/1747853.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。