首页 > 解决方案 > 异步 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()

???(除了第一个示例返回一个承诺这一显而易见的事实之外)

在同步函数中调用异步函数与在异步函数中调用同步函数是一样的吗?它们都产生相同的输出吗?如果是这样,哪一个比另一个更受欢迎?

标签: javascriptfunctionasynchronous

解决方案


要理解的关键是async函数是使用promises的语法糖。无论async是函数还是承诺都不会在后台发生任何事情。它们让您等待并响应后台已经发生的事情(如计时器或 HTTP 操作完成)。

一个async函数在第一个或之前是同步的。(这样它就可以启动它然后等待的任何异步过程。)此时,它返回一个承诺,该承诺将根据正在编辑的承诺发生的情况和/或您返回的内容而被履行或拒绝。awaitreturnawait

await暂停函数的逻辑,直到/除非正在await编辑的承诺解决。(如果您使用await valuewhere valueis not an thenable [a promise-like thing],那么您实际上是在做await Promise.resolve(value).)

您没有显示asyncFuncX函数的任何内容,但除非它们await是什么,否则它们是完全同步的。

您可能会发现我几天前的回答也很有用。


推荐阅读