⏱️

Dart で Future の逐次処理をする

2023/11/13に公開

内容

DartFuture.wait は平行処理です.
List<Future Function()> の逐次処理をする関数は特に提供されていないので, 自作します.

実装

Future<List<T>> executeSequentially<T>(
  List<Future<T> Function()> futureTasks,
) async {
  final results = <T>[];
  for (final task in futureTasks) {
    final result = await task();
    results.add(result);
  }
  return results;
}

再起処理でも同様に実装できます.
この場合, List.add を使わずに実装できます.

import 'dart:async';

Future<List<T>> executeSequentially<T>(List<Future<T> Function()> futureTasks) =>
    _executeSequentially(futureTasks);

Future<List<T>> _executeSequentially<T>(
  List<Future<T> Function()> futureTasks, [
  int index = 0,
  List<T> accumulated = const [],
]) async {
  if (index >= futureTasks.length) {
    return accumulated;
  }

  final result = await futureTasks[index]();
  return _executeSequentially(
    futureTasks,
    index + 1,
    [...accumulated, result],
  );
}

実行例

https://dartpad.dev/?id=24f54c6a83f1e074ef87f85df02c9fb3
https://dartpad.dev/?id=dbd4d0c693a6e5172b934d48641073dc

Discussion