Я делаю приложение с использованием фреймворка флаттера. Во время этого я наткнулся на ключевые слова в Dart async
и async*
. Кто-нибудь может сказать мне, в чем разница между ними?
Я делаю приложение с использованием фреймворка флаттера. Во время этого я наткнулся на ключевые слова в Dart async
и async*
. Кто-нибудь может сказать мне, в чем разница между ними?
Ответы:
Отметка функции как async
или async*
позволяет ей использовать ключевое слово async
/ await
для использования 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.
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
Технический термин для этого - функция асинхронного генератора. . Вы используете yield
для возврата значения, а не return
потому, что не покидаете функцию.
Вы можете использовать await for
для ожидания каждого значения, испускаемого Stream.
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
Посмотрите эти видео, чтобы узнать больше, особенно о генераторах:
Dart Documentation