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将继续执行

10-08 04:29