javascript - 异步 Javascript 混乱
问题描述
我对 Javascript 相当陌生,并且正在写这篇文章,所以如果我有任何错误,请纠正我。
据我所知,异步函数允许其他进程在后台运行,然后在函数完成后,它返回一个可以解决或拒绝的承诺。此外,由于异步函数中的进程不会按设定的顺序运行,我们可以使用 await 关键字来停止执行,直到进程完成。
然而,令我困惑的是代码执行上的差异
function f1() {
//do stuff
}
function f2() {
//do stuff
}
function f3() {
//do stuff
}
async function asyncFunc() {
f1()
f2()
f3()
}
asyncFunc()
和这个:
async function asyncf1() {
//do stuff
}
async function asyncf2() {
//do stuff
}
async function asyncf3() {
//do stuff
}
function f() {
asyncf1()
asyncf2()
asyncf3()
}
f()
???(除了第一个示例返回一个承诺这一显而易见的事实之外)
在同步函数中调用异步函数与在异步函数中调用同步函数是一样的吗?它们都产生相同的输出吗?如果是这样,哪一个比另一个更受欢迎?
解决方案
要理解的关键是async
函数是使用promises的语法糖。无论async
是函数还是承诺都不会在后台发生任何事情。它们让您等待并响应后台已经发生的事情(如计时器或 HTTP 操作完成)。
一个async
函数在第一个或之前是同步的。(这样它就可以启动它然后等待的任何异步过程。)此时,它返回一个承诺,该承诺将根据正在编辑的承诺发生的情况和/或您返回的内容而被履行或拒绝。await
return
await
await
暂停函数的逻辑,直到/除非正在await
编辑的承诺解决。(如果您使用await value
where value
is not an thenable [a promise-like thing],那么您实际上是在做await Promise.resolve(value)
.)
您没有显示asyncFuncX
函数的任何内容,但除非它们await
是什么,否则它们是完全同步的。
您可能会发现我几天前的回答也很有用。
推荐阅读
- react-native - 在 React Native 中使用 Overmind DevTools
- swift - 如何在 tableView 单元格之间添加空格?
- c# - 如果条件为假时发生的语句(System.Net)
- ruby-on-rails - 如何使用 Ruby on Rails 在下拉列表中显示我现有模型的属性
- android - 如何在 Flutter 中加载基于 sdk 版本的包?
- angular - 为什么在导入存储功能后调度操作时多次调用减速器?
- python - TensorFlow-gpu-2.0.0rc2 找不到 cuda-10.1 库并跳过已注册的 GPU 设备
- c# - 异步加载数据以在 .net core 2.2 中查看
- php - 使用公式将用户插入数据库不起作用
- amazon-web-services - 使用 https 将所有非 www 域重定向到 https://www