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