我可以在异步函数中抛出错误吗?

ser*_*off 8 javascript promise async-await es6-promise

async/await在我的Node.js项目中使用.在某些地方我需要从async函数返回错误.如果我使用Promises,我可以这样做:

function promiseFunc() {
  return new Promise((res, rej) => {
    return rej(new Error('some error'))
  })
}
Run Code Online (Sandbox Code Playgroud)

但我正在使用async函数,所以没有resrej方法在那里.那么,问题是:我可以throwasync函数中出错吗?或者它被认为是好/坏的做法?

我想做的一个例子:

async function asyncFunc() {
  throw new Error('some another error')
}
Run Code Online (Sandbox Code Playgroud)

我也可以这样重写它:

async function anotherAsyncFunc() {
  return Promise.reject(new Error('we need more errors!'))
}
Run Code Online (Sandbox Code Playgroud)

但第一个看起来更清楚,我不确定应该使用哪一个.

Pau*_*oze 9

我会做:

async function asyncFunc() {
  try {
    await somePromise();
  } catch (error) {
    throw new Error(error);
  }
}
Run Code Online (Sandbox Code Playgroud)

但我认为这取决于我个人的偏好?你总是可以回来Promise.reject(new Error(error));.

  • 请注意,提供的链接不解决 `await`/`async` 行为,而是使用 promise 的异步执行。`await`/`async` 的美妙之处之一是 [从 `async` 函数抛出的异常会自动包装在被拒绝的承诺中](https://developer.mozilla.org/en-US/docs/Web/JavaScript /Reference/Statements/async_function#Return_value),所以这样做是完全安全的。 (4认同)
  • “有些 linter 讨厌‘抛出错误’”——为什么?不好的短绒?大概。您可以省略“新”。请参阅 /sf/answers/930627841/。 (3认同)
  • 截至今天,还有另一个可能有用的链接:https://makandracards.com/makandra/43653-javascript-don-t-throw-exceptions-from-async-functions (2认同)
  • 为什么`throw new Error(error)`而不是`throw error`? (2认同)