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