Что происходит, когда await приостанавливает асинхронную функцию? - PullRequest
1 голос
/ 21 июня 2019
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()?

1 Ответ

1 голос
/ 21 июня 2019

Сначала PrintLotsOfStuff () вызывает метод printDailyNewsDigest (), который вызывает метод collectNewsReports, который затем приостанавливается, передавая управление обратно в printLotsOfStuff ().

Точно. Другими словами: printDailyNewsDigest() выполняется синхронно до тех пор, пока не достигнет первого await, затем функция возвращает свое выполнение, и вызов функции переводится в Обещание (таким образом, Обещание возвращается к функции, вызвавшей его). Поскольку PrintLotsOfStuff() игнорирует это обещание, с этого момента выполнение будет продолжаться синхронно.

Затем выполняется printWinningLotteryNumbers, printWeatherForecast и printBaseballScore. Что будет дальше, если ожидающий еще не вернулся?

Синхронное выполнение не может быть прервано. printDailyDiggest определенно еще не продолжил выполнение.

Возвращается ли он на верхний уровень, а затем запускается GoShopping () и HaveAGoodDay ()?

Конечно.

Теперь, если это было сделано, стек вызовов пуст, и у движка есть время для выполнения следующей задачи. Теперь, когда будет выполнено все ожидаемое * 1023, printDailyDiggest продолжит выполнение

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...