为什么我必须将异步关键字放在具有 await 关键字的函数上
Why do I have to put async keyword to functions which have await keywords?
我只想等待一个进程完成,不想使函数异步。
请参阅下面的代码。
我必须使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!!
}
}
这是一个设计选择吗?
这是因为JavaScript的同步性质。如果你想让一个函数同步运行一个异步命令,它会阻塞整个程序,这是非常不可取的,如果是客户端,那就不好了,如果是服务器端就可怕了。因此,存在async
函数。这些功能脱离了正常流程,这就是await
工作的原因。
为什么?
另一个原因是await
+async
是承诺的语法糖。承诺是异步的,你无法阻止它。这意味着 await 不会使异步函数同步,它只是保留 await 函数的其余部分,直到它完成。如果它确实阻塞了整个事件循环,想象一下,如果你想创建一个在客户端之间发送数据的应用程序。您的整个服务器应用程序每次发出异步请求时都会挂起,而不仅仅是使单个请求异步。
所以可以这样想:
您不是在进行异步函数同步,而是使程序的其余部分异步以应对它。
因此,与其认为async
await
的要求,不如将它们视为组合(async
+ await
),因为这就是它们的基本工作方式。如果您想了解有关异步和等待的更多信息,我强烈建议您阅读我的博客文章,其中对此进行了深入探讨。
相关文章:
- 使用“;这个“;JavaScript原型方法中的关键字
- delete关键字在全局变量上的不同行为
- JavaScript 中的嵌套函数和 “this” 关键字
- 如何在不使用 new 关键字的情况下从函数创建对象
- Angularjs使用“;这个“;promise内的关键字回调
- 重写需要javascript中带有import关键字的语法
- Regex,用于从字符串中筛选关键字
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 可以在Javascript中添加新的关键字吗
- javascript中的这个关键字
- Javascript关键字搜索子类Div值
- 在对象中用Javascript编写此关键字
- 在构建字典时,作为关键字的变量会自动变为字符串
- 正则表达式,从一组关键字中获取奇数
- 当在文本框中搜索关键字时,我会得到以前的结果作为输出
- '意外的令牌'使用await关键字时出错
- 多个调用者可以使用Babel await关键字订阅同一个异步函数吗?
- 当关键字后的表达式不计算为promise时,' await '应该发生什么?
- 为什么我必须将异步关键字放在具有 await 关键字的函数上