main(){
PrintLotsOfStuff();
GoShopping();
HaveAGoodDay();
}
PrintLotsOfStuff(){
printDailyNewsDigest();
printWinningLotteryNumbers();
printWeatherForecast();
printBaseballScore();
}
async printDailyNewsDigest() {
var newsDigest = await gatherNewsReports();
print (newsDigest);
}
gathernewsReports() {}
如果我们查看https://dart.dev/tutorials/language/futures,我们可以看到collectNewsReport()和print(newsDigest)在调用异步函数的函数中的所有函数之后运行。
但是,在我上面概述的情况下,还有一个层次。在这种情况下,流程看起来如何?
首先,
PrintLotsOfStuff()
调用printDailyNewsDigest()
,然后调用gatherNewsReports()
,然后将其挂起,将控制权传递回printLotsOfStuff()
。然后,它将运行printWinningLotteryNumbers,printWeatherForecast和printBaseballScore。如果等待仍未返回,接下来会发生什么?
它是否返回上一级,然后运行
GoShopping()
和HaveAGoodDay()
? 最佳答案
首先,PrintLotsOfStuff()调用printDailyNewsDigest(),后者调用collectNewsReports,然后将其挂起,将控制权传递回printLotsOfStuff()。
究竟。换句话说:printDailyNewsDigest()
同步执行直到到达第一个await
,然后该函数产生其执行,并且该函数调用求值为Promise(因此Promise会返回到调用它的函数中)。由于PrintLotsOfStuff()
忽略了该承诺,因此此后将继续同步执行。
然后,它将运行printWinningLotteryNumbers,printWeatherForecast和printBaseballScore。如果等待仍未返回,接下来会发生什么?
同步执行不能中断。 printDailyDiggest
显然还没有继续执行。
它是否返回上一级,然后运行GoShopping()和HaveAGoodDay()?
当然。
现在,如果已完成,则调用堆栈为空,并且引擎有时间执行下一个任务。现在,任何等待的printDailyDiggest
将完成,并且printDailyDiggest
将继续执行