【问题标题】:Why do I have to put async keyword to functions which have await keywords?为什么我必须将 async 关键字放在具有 await 关键字的函数中?
【发布时间】:2016-11-14 04:58:39
【问题描述】:

我只想等待一个进程完成,不想让函数异步。
请参阅下面的代码。
我不得不使 getUserList 异步,因为函数中有一个 await 关键字。因此,我还必须像“await UsersService.getUserList”一样编写来执行该方法,并且我还必须使父函数异步。那不是我想做的。

import xr from 'xr' //a package for http requests

class UsersService {

  static async getUserList() {
    const res = await xr.get('http://localhost/api/users')
    return res.data
  }

}

export default UsersService

import UsersService from './UsersService'

class SomeClass {

  async someFunction() { //async again!!
    const users = await UsersService.getUserList() //await again!!
  }

}

【问题讨论】:

  • 因为没有async,函数是同步的,因此 - 它保证完成它的主体执行并返回结果。
  • "我还必须让父函数异步" --- 你可以改用 Promise。
  • //await again!! --- 当然,如果它是异步的,你需要等待它完成。
  • await 表示同步对吗?所以 getUserList 方法对我来说应该是同步的。
  • "await 表示同步对吧?所以 getUserList 方法对我来说应该是同步的" --- 不,它的意思是“我们正在异步调用一个函数并且我们自己变得异步,因为我们需要等待结果”

标签: javascript async-await babeljs ecmascript-next


【解决方案1】:

这是一种设计选择吗?

这是因为 JavaScript 的同步特性。如果您想要一个函数同步运行异步命令,它将阻塞整个程序,这是非常不可取的,如果它是客户端则不好,如果它是服务器端则可怕。出于这个原因,async 函数存在。这些函数从正常流程中取出,这就是 await 起作用的原因。

为什么?

另一个原因是await+async 是承诺的语法糖。 Promise 是异步的,你无法停止。这意味着 await 不会使异步函数同步,它只是保持 await 函数的其余部分直到它完成。如果它确实阻塞了整个事件循环,想象一下如果你想创建一个在客户端之间发送数据的应用程序。您的整个服务器应用程序在每次发出异步请求时都会挂起,而不仅仅是使单个请求异步。

所以这样想:

您没有使异步函数同步,而是使程序的其余部分异步以应对它。

因此,与其将async 视为await 的要求,不如将它们视为一个组合(async+await),因为这就是它们的基本工作方式。如果您想了解更多关于 async 和 await 的信息,我强烈建议您阅读我的 blog article,它对此进行了深入探讨。

【讨论】:

  • “你正在使程序的其余部分异步以应对它。”我终于明白了!!谢谢!!
  • 您的博客已关闭。
  • 这是否意味着如果我使用了一次异步,我必须使每个使用该函数的函数都异步?
猜你喜欢
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多