Ваше недоразумение, что асинхронные функции возвращают Future
, а не значение. await
не конвертирует асинхронную синхронизацию.
var mappedList = list.map(
(i) async => await foo(i) // Returns a Future, not an int
);
Вы печатаете являются фьючерсы, возвращаемые (i) async => await foo(i)
.
Эти фьючерсы завершены, когда цепочка фьючерсов внутри них завершена. Когда срабатывает таймер: foo()
завершает работу, затем await foo(i)
, затем ваша функция отображения.
Сравнить с:
main() async {
List<int> list = [1,2,3,4,5];
Iterable<Future<int>> mapped;
// Prints ints 1 second apart
mapped = list.map((i) => foo(i));
for(Future<int> f in mapped) {
print(await f);
}
// Prints ints all at once, after 1 second wait
mapped = list.map((i) => foo(i));
for(Future<int> f in mapped) {
f.then(print);
}
}
На Dartpad: https://dartpad.dartlang.org/151949be67c0cdc0c54742113c98b291
Некоторые вещи, чтобы отметить:
List.map()
возвращает ленивым Iterable
(не List
), что означает функцию отображения ISN» t до тех пор, пока не будет выполнено повторение Iterable
.
Первых ожиданий цикла для каждого Future
, чтобы завершить перед печатью и перейти к следующему пункту в Iterable
, функция отображения для следующего элемента (и, следовательно, foo()
) называются после печатью каждого значения, поэтому значения с интервалом в 1 секунду.
Вторая петля итерации через Iterable
немедленно, настройка функции печати для выполнения после завершения каждого Future
. Вызывается сразу 5 экземпляров функции foo(), которые все возвращаются примерно на 1 секунду позже, затем выводятся все 5 значений.