Яка різниця між async та async * у Dart?


84

Я роблю заявку, використовуючи фламтер фреймворк. Під час цього я зіткнувся з ключовими словами в Dart asyncі async*. Хто-небудь може сказати мені, яка різниця між ними?

Відповіді:


113

Позначення функції як asyncабо async*дозволяє їй використовувати async/ awaitключове слово для використання a Future.

Різниця між ними полягає в тому async*, що завжди повертає a Streamі пропонує деякий синтаксис цукру, щоб виділити значення через yieldключове слово.

Тому ми можемо зробити наступне:

Stream<int> foo() async* {
  for (int i = 0; i < 42; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Ця функція видає значення щосекунди, яке щоразу збільшується


2
Ви повинні додати, де ви берете приклад, приємно прочитати Dart Documentation, а також посилання :)
Skizo-ozᴉʞS

3
@ Skizo-ozᴉʞS посилання мертве. Найкращий документ, який я міг знайти на ньому: dart.dev/tutorials/language/streams .
wdev

1
Позначивши функцію як асинхронну *, ми можемо використовувати ключове слово yield і повернути Потік даних.
Яш,

71

Коротка відповідь

  • async дає вам Future
  • async*дає вам Stream.

асинхронний

Ви додаєте asyncключове слово до функції, яка виконує певну роботу, яка може зайняти багато часу. Повертає результат, загорнутий у Future.

Future<int> doSomeLongTask() async {
  await Future.delayed(const Duration(seconds: 1));
  return 42;
}

Ви можете отримати цей результат, чекаючи майбутнього:

main() async {
  int result = await doSomeLongTask();
  print(result); // prints '42' after waiting 1 second
}

async *

Ви додаєте async*ключове слово, щоб створити функцію, яка повертає купу майбутніх значень по черзі. Результати обертаються потоком.

Stream<int> countForOneMinute() async* {
  for (int i = 1; i <= 60; i++) {
    await Future.delayed(const Duration(seconds: 1));
    yield i;
  }
}

Технічним терміном для цього є асинхронна генераторна функція . Ви використовуєте yieldдля повернення значення, а не returnтому, що не залишаєте функцію.

Ви можете використовувати await forдля очікування кожного значення, випущеного потоком.

main() async {
  await for (int i in countForOneMinute()) {
    print(i); // prints 1 to 60, one integer per second
  }
}

Продовжувати

Перегляньте ці відео, щоб дізнатись більше, особливо це стосується генераторів:


2
"Перегляньте ці відео" - було б чудово, якби ви могли надати текстові посилання. Не всі захоплюються відео ...
Аконкагуа,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.