Я делаю приложение с использованием фреймворка флаттера. Во время этого я наткнулся на ключевые слова в 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 дает вам Futureasync*дает вам 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