【问题标题】:await with promise inside try/catch在 try/catch 中等待承诺
【发布时间】:2020-01-01 08:53:52
【问题描述】:

例如,我有以下功能:

public static async getUser(userId: number): Promise<UserModel> {
    try {
        const permissions: PermissionsModel[] = await this.getPermissions(userId);
        const userWithRelation: UserModel[] = await this.findUsers(userId, permissions);

        return Promise.resolve(userWithRelation);

    } catch (e) {
        return Promise.reject(e);
    }
}

现在,WebStorm 警告我应该在 try 和 catch 块中将 await 放在 Promise.resolve() 之前。我对 Node 很陌生,所以我应该等待还是不等待,为什么?

注意:这只是示例函数,不是我不能公开展示的真实代码。

【问题讨论】:

  • 你不应该把await放在Promise.resolve之前,但你也不应该把Promise.resolve放在前面。由于您的函数是异步的,因此它将返回您通常返回的任何内容的承诺,因此您应该执行 return userWithRelation; 。请注意,这不是 node.js 的怪癖,它是 ES6 和 TypeScript 与异步函数一起工作的方式。 catch 部分也根本不需要,因为当异常发生时,返回的 promise 无论如何都会被拒绝

标签: node.js typescript


【解决方案1】:

Promise 和 async/await 是异步编程的两种不同语法。 WebStorm 警告您的是,由于您在 async 函数中使用 await,所以 await 应该是从 async 函数返回的东西,而不是 resolve Promise。您应该选择使用 async/await 语法或 Promise。你可以在 MDN 的网站上看到不同之处:

对于异步/等待:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

对于承诺:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

【讨论】:

  • 我不能同意,async 中不应返回 await。你用 await 调用异步函数。此外,如果我删除 try/catch 块,WebStorm 不会等待。
【解决方案2】:

我不确定警告,但您可以将代码缩短为

public static async getUser(userId: number): Promise<UserModel> {
    try {
        return this.findUsers(userId);
    } catch (e) {
        // Do something with the error
        return Promise.reject(e);
    }
}

如果您在 catch 块中没有做任何其他事情,那么您实际上可以省略它并将您的功能减少到

public static async getUser(userId: number): Promise<UserModel> {
  return this.findUsers(userId);
}

【讨论】:

  • 这不是我如何或应该简化的问题。这只是示例函数,不是我无法展示的真实代码
【解决方案3】:

如果awaited Promise 拒绝,它的拒绝值将是catch 处理程序中的错误。如果它解析,则分配给awaited Promise 的值将是解析值。因此,您的代码可以简化为:

public static async getUser(userId: number): Promise<UserModel> {
    return this.findUsers(userId);
}

awaiting 一个 Promise,其解析值将立即返回,其拒绝将作为被拒绝的 Promise 返回,是多余的 - 只需返回 Promise 本身。

【讨论】:

  • 这不是我如何或应该简化的问题。这只是示例函数,不是我无法展示的真实代码。
猜你喜欢
  • 2020-08-20
  • 2021-02-07
  • 2020-11-13
  • 2013-09-16
  • 2019-04-29
  • 2020-10-31
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多