7

我只想等待一个进程完成,不想使函数异步。
请参阅下面的代码。
我不得不使 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!!
  }

}
4

1 回答 1

10

是设计选择吗?

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

为什么?

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

所以这样想:

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

因此,与其考虑对async的要求await,不如将它们视为组合(async+ await),因为这就是它们的基本工作方式。如果您想了解更多关于异步和等待的信息,我强烈建议您阅读我的博客文章,该文章对此进行了深入探讨。

于 2016-07-12T05:46:26.347 回答