2

私たちの目標は、Listと呼ぶ を構築することだとしましょうstoredResult

Future<List>複数回呼び出される戻り関数があります。

Future<List> getList()...

未知数に対して関数を複数回呼び出し、getList()それぞれの結果を に保存したいとListしますstoredResult

List storedResult = [];

someOtherList.forEach((element)){
    getList().then((resultingList)){
        storedResult.addAll(resultingList);
    }
}

print(storedResult);

このコードを実行すると、 として出力され[]ます。結果が次のようになるように、これをどのように表現しますか。

[resultingList, resultingList, ..., ]
4

1 に答える 1

3

Future はすぐに戻りますが、関連するコールバックは非同期で実行されることに注意してください。具体的には、実行がイベント ループに戻るまで、実行する作業getList()(および実行するすべてのことthen) は発生しません。

あなたの問題は、非同期操作の結果を同期的に出力しようとしていて、それがうまくいかないことです。

保存された結果を使用したい場合は、次のようにする必要があります。

Future<List<List>> globFutures(List someOtherList) {
  List<Future> futures = [];
  someOtherList.forEach((element) {
    futures.add(getList());
  });

  // Automatically completes to a List containing all the
  // results of all of the futures.
  return Future.wait(futures);
}

main() {
  var storedResults = [];

  globFutures(someOtherList)
    .then((List<List> results) {
      storedResults = results;

      // Run code in here that depends on storedResults being available.
      print(storedResults);
    });

  // Do **NOT** use storedResults here, as it will be [].
  // The Future functions have not yet run!
  assert(storedResults == []);
};
于 2013-04-21T05:42:32.137 に答える