异步Javascript混淆

异步Javascript混淆,javascript,function,asynchronous,Javascript,Function,Asynchronous,我对Javascript还比较陌生,写这篇文章是出于我的想法,所以如果我有任何错误,请纠正我 据我所知,异步函数允许其他进程在后台运行,然后在函数完成后,它返回一个可以解析或拒绝的承诺。另外,由于异步函数中的进程不按设置的顺序运行,因此我们可以使用wait关键字停止执行,直到进程完成 然而,让我感到困惑的是两者在代码执行上的差异 function f1() { //do stuff } function f2() { //do stuff } function f3() { //

我对Javascript还比较陌生,写这篇文章是出于我的想法,所以如果我有任何错误,请纠正我

据我所知,异步函数允许其他进程在后台运行,然后在函数完成后,它返回一个可以解析或拒绝的承诺。另外,由于异步函数中的进程不按设置的顺序运行,因此我们可以使用wait关键字停止执行,直到进程完成

然而,让我感到困惑的是两者在代码执行上的差异

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()
""????? (除了第一个示例返回承诺这一明显事实之外)

在同步函数中调用异步函数是否与在异步函数中调用同步函数相同?它们是否都产生相同的输出?如果是的话,哪一个是首选的

在同步函数中调用异步函数是否与在异步函数中调用同步函数相同

一点也不<代码>异步函数由JavaScript执行环境安排,在同步函数流之外单独执行(在第一个
等待
之后)。这意味着
async
函数(可以)在调用同步函数
return
退出后继续运行

如果运行下面的代码段,您可以看到输出是
in
out
f1
f2
f3
,即使
f
函数显然似乎在
in
f1
f2
f3
out

(该示例有一个额外的
await noop()
,以真正实现异步。)

异步函数noop(){}
异步函数asyncf1(){
等待noop();
console.log('f1');
}
异步函数asyncf2(){
等待noop();
console.log('f2');
}
异步函数asyncf3(){
等待noop();
console.log('f3');
}
函数f(){
console.log('in');
asyncf1();
asyncf2();
asyncf3();
console.log('out');
}

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

异步
函数在第一个
等待
返回之前是同步的。(这样它就可以启动它等待的任何异步进程。)此时,它将返回一个承诺,该承诺将被履行或拒绝,具体取决于被
wait
ed和/或返回的内容

await
暂停函数的逻辑,直到/除非
await
ed的承诺解决。(如果您使用
wait-value
value
不是一个表[类似承诺的东西],那么您实际上是在做
wait-promise.resolve(value)

您尚未显示
asyncFuncX
函数的任何内容,但除非它们
等待
某些内容,否则它们是完全同步的


您可能也会发现它很有用。

您的代码中没有等待。。。因此,情况将是一样的。首选什么取决于手头的任务。异步函数允许其他进程在后台运行,然后在函数完成后,它返回一个可以解决或拒绝的承诺。研究建议-1。异步函数的实际功能。2.JavaScript中的多线程。具体地说,它是一个选择性加入,大多数代码仍然运行单线程。第一个有效,第二个无效。是否使用异步功能通常不是您的决定。异步函数必须从异步函数(或正确处理结果承诺的异步感知站点)调用@T.J.Crowder的可能重复项澄清。“如果运行下面的代码段,您只能在这个特定示例中看到输入、输出、f1、f2、f3”。例如,如果在
asyncf2
中没有
await
,那么您将进入->f2->out->f1->F3,直到第一个
await
函数才意识到
async
函数是同步的。我的思维模式是,他们基本上总是被分派到任务中。直到,谢谢:)@AKX-:-)很荣幸!@Jackbaklava(好吧,或者其他任何人)我在我最近的新书《JavaScript:新玩具》第8章和第9章中详细介绍了承诺和
异步
函数。如果您感兴趣,请访问我的个人资料中的链接。@AKX如果您熟悉,
async
的JavaScript实现相当于对状态机中的
initial\u suspend()
挂起点使用
suspend\u never
类型,这意味着JavaScript中的异步函数是急切启动的,而不是缓慢启动的。相反,JavaScript中的生成器函数相当于使用
suspend\u always
类型作为
initial\u suspend()!所以它们是一样的,因为我没有使用任何等待。这就解释了一切。谢谢!:)@T.J.Crowder