あなたの誤解は、非同期機能がFuture
、ない値を返すということです。 await
は、asyncをsyncに変換しません。
var mappedList = list.map(
(i) async => await foo(i) // Returns a Future, not an int
);
(i) async => await foo(i)
から返された先物です。
これらの先物は、先物のチェーンが完了した時点で完了します。タイマーが起動すると、foo()
が完了し、次にawait foo(i)
にマッピングされます。 https://dartpad.dartlang.org/151949be67c0cdc0c54742113c98b291
いくつかの点に注意する:Dartpadオン
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);
}
}
:
は、と比較し
List.map()
を返し怠惰Iterable
(ないList
)マッピング関数ISN」の意味Iterable
が繰り返されるまで呼び出されません。
印刷前に完了する各Future
ための第1のループ待機しIterable
内の次の項目に移動する、次の項目(従ってfoo()
)のマッピング関数は、値があるので、それぞれの値を印刷後と呼ばれています1秒間隔で印刷される。
2番目のループは、Future
が完了するたびに実行する印刷機能を設定してすぐにIterable
を反復します。関数foo()の5つのインスタンスが一度に呼び出されます。すべて約1秒後に戻り、5つの値がすべて出力されます。