【问题标题】:Why doesn't TypeScript enforce async/await on promise?为什么 TypeScript 不强制执行 async/await 承诺?
【发布时间】:2020-06-11 16:56:01
【问题描述】:

我有以下代码。 performAsyncAction 执行异步操作并返回 Promise<Response>。在 someFunction 中,我很惊讶 TypeScript 没有警告 not 在返回承诺的函数上使用 await。

function performAsyncAction() {
  return fetch('someservice');
}

function someFunction() {
    const result = performAsyncAction(); // Was expecting typescript to give error here
}

我找到了一个相关的 linting 规则,可能对 promise-function-async 有所帮助

【问题讨论】:

  • 没有错误,result 是一个 Promise,那里没有 await
  • 为什么要这样?例如,存储 promise 以与 Promise.all() 并行运行它们是一个完全有效的用例。 TS 无法预测您为什么要存储承诺而不是等待它
  • 但是,如果 typesctipt / linter 会强制您将所有返回 Promise 的东西都输入到 await,您如何将 Promise 放入您传递给 Promise.all() 的数组中?
  • 也许思考这个问题的方式是 typescript 是关于语法的,而 awaiting a promise 是关于语义的。是否阻止执行结果是一个设计问题。
  • 我猜 Klaycon 和 Thomas 假设 OP 认为所有返回 Promise 的东西都会神奇地被等待和打开?那么await 关键字是干什么用的呢?我不明白这个问题有什么意义

标签: javascript typescript async-await es6-promise


【解决方案1】:

我完全同意你的看法。根据我的经验,忘记等待承诺是大多数问题的根源,尤其是处理错误时。

尽管await/async 语法存在于纯 JS 中,但引入另一种语法糖来通知 TS 编译器您打算离开承诺以“在后台”运行是非常有意义的。

与任何其他严格检查一样,这将是可选的。

例如

async function someFunction() {
   const result = performAsyncAction(); // Compilation error
}

async function someFunction() {
   const result = along performAsyncAction(); // Returns promise
}

async function someFunction() {
   const result = await performAsyncAction(); // Awaits the promise
}

【讨论】:

    【解决方案2】:

    这不是错误,而是预期的行为。

    1. Promise 早在 async/await 之前就存在了,您有几种方法可以处理它们
    2. 等待承诺是函数的内部逻辑,而不是要求
    3. Typescript 很清楚你有 Promise 而不是 Promise 中的值,所以如果你想以错误的方式使用它,它会警告你
    4. 你提供的函数不是async,所以根本不可能在那里等待
    5. await/async 和 Promise 在 Javascript 中是一回事,不管你是 await Promise 还是 .then Promise,它唯一的语法糖(虽然有用)
    6. 在很多情况下你不想等待新创建的 Promise,即允许一次处理多个 Promise,从而减少处理请求的时间

    【讨论】:

      猜你喜欢
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2016-05-20
      相关资源
      最近更新 更多