Javascript 当wait挂起异步函数时会发生什么?

Javascript 当wait挂起异步函数时会发生什么?,javascript,async-await,Javascript,Async Await,如果我们继续观察,我们可以看到gatherNewsReport()和print(newsDigest)在调用异步函数的函数中的所有函数之后运行 然而,在我上面概述的情况下,还有一个层次。在这种情况下,流看起来如何 首先printlotsofsuff()调用printdailynewsdgest(),调用gatherNewsReports(),然后暂停,将控制权传递回printlotsofsuff() 然后运行printWinningLotteryNumbers、printWeatherForec

如果我们继续观察,我们可以看到gatherNewsReport()和print(newsDigest)在调用异步函数的函数中的所有函数之后运行

然而,在我上面概述的情况下,还有一个层次。在这种情况下,流看起来如何

首先
printlotsofsuff()
调用
printdailynewsdgest()
,调用
gatherNewsReports()
,然后暂停,将控制权传递回
printlotsofsuff()

然后运行printWinningLotteryNumbers、printWeatherForecast和printBaseballScore。如果等待还没有回来,接下来会发生什么

它是否返回到上层,然后运行
GoShopping()
HaveAGoodDay()

首先,PrintLotusStuff()调用printDailyNewsDigest(),后者调用gatherNewsReports,然后将暂停,将控制权传递回PrintLotusStuff()

没错。换句话说:
printDailyNewsDigest()
同步执行,直到它到达第一个
Wait
,然后函数产生其执行,函数调用计算为承诺(因此承诺返回给调用它的函数)。由于
printlotsofsuff()
忽略了该承诺,执行将从那时起同步继续

然后运行printWinningLotteryNumbers、printWeatherForecast和printBaseballScore。如果等待还没有回来,接下来会发生什么

同步执行不能被中断
printDailyDiggest
显然尚未继续执行

它是否返回到上层,然后运行GoShopping()和HaveAGoodDay()

当然


现在,如果这样做了,调用堆栈将为空,引擎将有时间执行下一个任务。现在,当等待的
printDailyDiggest
将完成时,
printDailyDiggest
将继续执行它

如何使用一些
console.log()
s测试它?您刚才问了,然后删除了它。你为什么期待一个不同的回应?是不是很难得到回应。是的,我会做小提琴。那我就去做。我原以为只要问一下就好了,但到时候我会这么做的。我想要的只是确认或不同意我的理解是对还是错你什么都不退。。。(哦,那不是你要问的)“我以为只是问会更容易…”-问是可以的,但你应该在问之前做一些研究。在这种情况下,最简单的“研究”应该是执行代码(在修改
gathernewsReports()
以返回
Promise
后,否则
Wait
将无效)并检查输出。谢谢。并不是我不想做研究。我面前有一个非常类似的案例,人们在整个案例中错误地使用异步,导致了各种各样的错误。如此之多以至于我怀疑我是否正确地解释了我所看到的。我猜,在第一个问题返回之前,更高级别的等待不会返回。完全同意,我不明白你之前的问题为什么被否决(而所有其他错误的评论/答案都证明这显然不是那么容易),是的,如果你想做
printlotsofsuff()
async
并将
等待printDailyNewsDiggest()
然后调用
printlotsofsuff()
将返回一个承诺,该承诺只有在
printDailyNewsDiggest
完成执行后才能解决。然后,这个承诺可以再次被
wait
ed等等。无论如何,我在大约3年前就已经使用了Async Wait,但它并没有被多层掩埋,我也从来不用太担心这些细节。
main(){
    PrintLotsOfStuff();
    GoShopping();
    HaveAGoodDay();

}

PrintLotsOfStuff(){
    printDailyNewsDigest();
    printWinningLotteryNumbers();
    printWeatherForecast();
    printBaseballScore();
}

async printDailyNewsDigest() {
   var newsDigest = await gatherNewsReports();
   print (newsDigest);
}

gathernewsReports() {}