javascript – 使用非立即异步/等待时正确放置try / catch块

我一直在使用异步/等待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!");
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐