wait 属性

Future<(T1, T2, T3, T4, T5, T6, T7, T8)> wait

并行等待多个 Future。

等待此记录中的所有 Future。如果所有 Future 都成功,则返回值记录。

当所有 Future 都完成时,返回的 Future 被完成。如果任何 Future 未完成,则返回的 Future 也不会完成。

如果某些 Future 完成时出现错误,则返回的 Future 以 ParallelWaitError 完成。The ParallelWaitError.values 是成功 Future 的值记录,对于出现错误的 Future 为 null。The ParallelWaitError.errors 是具有相同形状的记录,成功 Future 的值为 null,而出现错误的 Future 则有 AsyncError,其中包含完成时出现错误的 Future 的错误。

实现

Future<(T1, T2, T3, T4, T5, T6, T7, T8)> get wait {
  final c = Completer<(T1, T2, T3, T4, T5, T6, T7, T8)>.sync();
  final v1 = _FutureResult<T1>($1);
  final v2 = _FutureResult<T2>($2);
  final v3 = _FutureResult<T3>($3);
  final v4 = _FutureResult<T4>($4);
  final v5 = _FutureResult<T5>($5);
  final v6 = _FutureResult<T6>($6);
  final v7 = _FutureResult<T7>($7);
  final v8 = _FutureResult<T8>($8);

  _FutureResult._waitAll([v1, v2, v3, v4, v5, v6, v7, v8], (int errors) {
    if (errors == 0) {
      c.complete((
        v1.value,
        v2.value,
        v3.value,
        v4.value,
        v5.value,
        v6.value,
        v7.value,
        v8.value
      ));
    } else {
      c.completeError(ParallelWaitError(
        (
          v1.valueOrNull,
          v2.valueOrNull,
          v3.valueOrNull,
          v4.valueOrNull,
          v5.valueOrNull,
          v6.valueOrNull,
          v7.valueOrNull,
          v8.valueOrNull
        ),
        (
          v1.errorOrNull,
          v2.errorOrNull,
          v3.errorOrNull,
          v4.errorOrNull,
          v5.errorOrNull,
          v6.errorOrNull,
          v7.errorOrNull,
          v8.errorOrNull
        ),
          errorCount: errors,
          defaultError: v1.errorOrNull ??
              v2.errorOrNull ??
              v3.errorOrNull ??
              v4.errorOrNull ??
              v5.errorOrNull ??
              v6.errorOrNull ??
              v7.errorOrNull ??
              v8.errorOrNull
      ));
    }
  });
  return c.future;
}