Я роблю заявку, використовуючи фламтер фреймворк. Під час цього я зіткнувся з ключовими словами в Dart async
і async*
. Хто-небудь може сказати мені, яка різниця між ними?
Я роблю заявку, використовуючи фламтер фреймворк. Під час цього я зіткнувся з ключовими словами в Dart async
і async*
. Хто-небудь може сказати мені, яка різниця між ними?
Відповіді:
Позначення функції як 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;
}
}
Ця функція видає значення щосекунди, яке щоразу збільшується
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*
ключове слово, щоб створити функцію, яка повертає купу майбутніх значень по черзі. Результати обертаються потоком.
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
}
}
Перегляньте ці відео, щоб дізнатись більше, особливо це стосується генераторів:
Dart Documentation
, а також посилання :)