【问题标题】:Returning promise from async function从异步函数返回承诺
【发布时间】:2022-01-08 13:30:14
【问题描述】:

可以像下面这样承诺退货吗? catch 块是返回 promise 还是正常的 Error?

async function beforeProcessing(ctx) {
  try {
      let res = await validateList(ctx)
      return new Promise((resolve, reject) => {
          if (res && res.length > 0) {
              const customErr = new Error(`missing for ${res} types`);
              customErr.statusCode = 422;
              reject(customErr);
          }
          else {
              resolve();
          }
      })
  } catch (error) {
      return new Error(error);
  }
}

【问题讨论】:

  • 该函数将始终返回一个被标记为async的承诺。无论函数返回什么,等待该承诺总是会产生一个值。函数里面的new Promise是没有意义的。

标签: javascript node.js async-await promise es6-promise


【解决方案1】:

是的,但没有理由这样做。 async 函数总是返回承诺。只需处理该逻辑内联,然后抛出 customErr 以拒绝函数的承诺:

async function beforeProcessing(ctx) {
    let res;
    try {
        res = await validateList(ctx)
    } catch (error) {
        return new Error(error); // *** This is highly suspect
    }
    if (res && res.length > 0) {
        const customErr = new Error(`missing for ${res} types`);
        customErr.statusCode = 422;
        throw customErr;
    }
}

但正如我在上面的评论中提到的,返回一个错误对象是高度可疑的,它实现带有错误的承诺,而不是拒绝承诺。只需让错误传播给调用者(这将拒绝async 函数的承诺):

async function beforeProcessing(ctx) {
    let res = await validateList(ctx)
    if (res && res.length > 0) {
        const customErr = new Error(`missing for ${res} types`);
        customErr.statusCode = 422;
        throw customErr;
    }
}

此外,if 条件与错误消息相比看起来很奇怪。错误消息使条件看起来应该是<= 0,而不是> 0,但当然我可能在那里推断不正确。

【讨论】:

  • FWIW,我在我最近的书 JavaScript: The New Toys 的第 8 章和第 9 章中深入探讨了 Promise 和 async/await。如果您有兴趣,请在我的个人资料中链接。
  • 条件是如果 res 是>0 则抛出错误。谢谢,TJ
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2018-12-22
相关资源
最近更新 更多