async / await - не дожидаясь будущего () - Dart - PullRequest
0 голосов
/ 11 ноября 2018

На основе официальной страницы Dart При использовании Async / Wait :

Когда приложение видит слово async, оно обычно выполняет функцию синхронно, пока не увидит await или return

Обратите внимание, что асинхронная функция начинает выполняться сразу (синхронно). Функция приостанавливает выполнение и возвращает незавершенного будущего, когда оно достигнет первого появления любого из следующее:

  • Первое выражение ожидания функции (после того, как функция получает незавершенное будущее от этого выражения).
  • Любой оператор возврата в функции.
  • Конец тела функции.

и когда он видит любую из них, он возвращает незавершенную Future и останавливает выполнение функции async, пока не выполнит все другие функции, и когда все остальные функции будут выполнены, приложение вернется к async функция и выполняет то, что внутри нее.

Вот фотография с официальной страницы Dart, объясняющая это более подробно:
Dart Image

Но когда я тестировал, я пытался добавить оператор print перед возвратом будущего результата, как вы можете видеть в приведенном ниже коде, но результат был не таким, как указано на сайте, как говорится что приложение перестает выполняться, когда видит слово await, но выражение: «Async - Hi Called 1st» было напечатано, как вы можете видеть до того, как другие функции были выполнены.

import 'dart:async';

Future<void> print1stAsync() async {
  var test = await callAsync();
  print(test);
}

main() {
  print1stAsync();
  print2nd();
  print3rd();
  print4th();
}

print2nd() {
  print('Called 2nd');
}

print3rd() {
  print("Called 3rd");
}

print4th() {
  print('Called 4th');
}

Future<String> callAsync() {
  print("Async - Hi Called 1st");
    return Future(() => "Async - Called 1st ");
  }

Выход:

Async - Hi Called 1st
Called 2nd
Called 3rd
Called 4th
Async - Called 1st 

Так почему это происходит? я что-то упустил понял?

1 Ответ

0 голосов
/ 11 ноября 2018

Приложение не прекращает выполнение, только выполнение кода после await задерживается до завершения возвращенного Future.

Вам также необходимо дождаться вызова асинхронной функции print1stAsync(), в противном случае выполнение main продолжается после вызова callAsync(); (после вызова, а не после завершения Future, которое он возвращает)

main() async {
  await print1stAsync();
  print2nd();
  print3rd();
  print4th();
}

Добавление asnyc к функции также означает, что эта функция возвращает Future. Невозможно вернуться из асинхронной синхронизации. Асинк заразен.

await callAsync(); означает, что код под этой строкой в ​​той же функции (например, print(test); в вашем примере) будет задержан.
Он ничего не говорит о коде в callAsync () или коде, который вызывает print1stAsync();

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