Dart Futureクラスstatic wait()メソッド

Dar言語StreamクラスtoSet()メソッドDart

Dart Futureクラスのstatic wait()メソッドについてメモ書き。

wait()は複数のFutureの実行結果を取得するstaticメソッド。
wait()の戻り値はFuture<List<T>>となっており、Futureの実行結果は配列で返される。
第1引数で実行結果を取得するFutureを配列で受け取る。
第2引数はbool型名前付きオプション引数「eagerError:」で、trueを指定するといずれかのFutureがエラーになると即座に終了する。falseを指定すると完了を待ってから終了する。デフォルトはfalse。
第3引数はvoid型名前付きオプション引数「cleanUp:」。「cleanUp:」はエラー時に使用される。wait()で複数のFuture処理を実行し、そのうちの一つがエラーになると成功したFutureはリソースを解放せずに終了してしまう。「cleanUp:」を使用する事で成功したFutureの戻り値を受け取り、リソースを解放することができる。
第2、第3引数はオプション引数なので省略可能。

コーディングで動きを確認。
testTime1()関数とtestTime2()関数をwait()の引数として指定し、実行結果を出力する。

void main() async {
  var val = await Future.wait([testTime1(), testTime2()]);
  for (var element in val) {
    print(element);
  }
}

Future<String> testTime1() async {
  await Future.delayed(Duration(seconds: 1));
  return "testTime1";
}

Future<String> testTime2() async {
  await Future.delayed(Duration(seconds: 2));
  return "testTime2";
}

実行結果。

testTime1
testTime2

次はtestTime1()関数で意図的にエラーを発生させ、testTime2()関数は正常終了させる。
引数として「eagerError:false 」と「cleanUp:」を追加する。

void main() async {
  try {
    var val = await Future.wait(
      [testTime1(), testTime2()],
      eagerError: false,
      cleanUp: (successValue) {
        print(successValue);
      },
      // ignore: body_might_complete_normally_catch_error
    ).catchError((err) {
      print(err.toString());
    });
    for (var element in val) {
      print(element);
    }
  } catch (e) {
    print(e.toString());
  }
}

Future<String> testTime1() async {
  try {
    await Future.delayed(Duration(seconds: 1));
    throw "test error";
  } catch (e) {
    rethrow;
  }
  // ignore: dead_code
  return "testTime1";
}

Future<String> testTime2() async {
  await Future.delayed(Duration(seconds: 3));
  return "testTime2";
}

実行結果。
「cleanUp:」を指定したので、testTime2()関数が正常終了した値を受け取る。
また「eagerError:false 」なので、エラーはtestTime2()関数完了後に返される。

testTime2
test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type

次は「eagerError:true 」を指定。

void main() async {
  try {
    var val = await Future.wait(
      [testTime1(), testTime2()],
      eagerError: true,
      cleanUp: (successValue) {
        print(successValue);
      },
      // ignore: body_might_complete_normally_catch_error
    ).catchError((err) {
      print(err.toString());
    });
    for (var element in val) {
      print(element);
    }
  } catch (e) {
    print(e.toString());
  }
}

Future<String> testTime1() async {
  try {
    await Future.delayed(Duration(seconds: 1));
    throw "test error";
  } catch (e) {
    rethrow;
  }
  // ignore: dead_code
  return "testTime1";
}

Future<String> testTime2() async {
  await Future.delayed(Duration(seconds: 3));
  return "testTime2";
}

実行結果。
「eagerError:true 」なのでエラーはtestTime2()関数完了前に返される。

test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type
testTime2

最後は「cleanUp:」を指定せずにエラーを発生させる。

void main() async {
  try {
    var val = await Future.wait(
      [testTime1(), testTime2()],
      eagerError: true,
      // ignore: body_might_complete_normally_catch_error
    ).catchError((err) {
      print(err.toString());
    });
    for (var element in val) {
      print(element);
    }
  } catch (e) {
    print(e.toString());
  }
}

Future<String> testTime1() async {
  try {
    await Future.delayed(Duration(seconds: 1));
    throw "test error";
  } catch (e) {
    rethrow;
  }
  // ignore: dead_code
  return "testTime1";
}

Future<String> testTime2() async {
  await Future.delayed(Duration(seconds: 3));
  return "testTime2";
}

実行結果。
クリーンナップ処理が実行されないため、testTime2()関数の結果は出力されない。

test error
Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type

コメント

タイトルとURLをコピーしました