为什么我必须将async关键字放到有等待关键字的函数中?

Nig*_*iri 5 javascript async-await babeljs ecmascript-next

我只想等待一个进程完成,不想让函数异步.
请参阅以下代码.
我不得不使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
Run Code Online (Sandbox Code Playgroud)
import UsersService from './UsersService'

class SomeClass {

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

}
Run Code Online (Sandbox Code Playgroud)

Dow*_*oat 8

这是一个设计选择吗?

这是因为JavaScript的同步特性.如果你想要一个函数同步运行一个异步命令,它会阻塞整个程序,这是非常不受欢迎的,如果它是客户端那么糟糕,如果它是服务器端则很糟糕.因此async存在功能.这些功能从正常流程中取出,这就是为什么await有效.

为什么?

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

所以想一想:

您没有进行异步功能同步,而是让程序的其余部分异步处理它.

因此,不要将其视为async一种要求await,而应将它们视为一种组合(async+ await),因为它们是从根本上发挥作用的.如果你想了解更多有关异步和等待的信息,我强烈建议您阅读我的博客文章,深入了解这一点.

  • "你正在使程序的其余部分异步处理它." 我最终明白!! 谢谢!! (2认同)