Я делаю приложение с использованием фреймворка флаттера. Во время этого я наткнулся на ключевые слова в Dart async
и async*
. Кто-нибудь может сказать мне, в чем разница между ними?
89
Отметка функции как 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;
}
}
Эта функция каждую секунду выдает значение, которое увеличивается каждый раз.
Dart Documentation
Краткий ответ
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 } }
Продолжается
Посмотрите эти видео, чтобы узнать больше, особенно о генераторах:
источник