Выберите будущее или waitAny в Dart?


Я понимаю, что Future.wait берет список фьючерсов и возвращает список завершенных фьючерсов, когда все фьючерсы в списке завершены.

Есть ли способ в Dart блокировать и ждать, пока любое будущее в списке не завершится, а не ждать, пока они все завершатся?

1 3

1 ответ:

Не совсем. Мы могли бы добавить a Future.waitAny (где существующий неявно a waitAll).

Функциональность проста:

Future waitAny(Iterable<Future> futures) {
  var completer = new Completer();
  for (var f in futures) {
    f.then((v) { 
      if (!completer.isCompleted) completer.complete(v);
    }, onError: (e, s) {
      if (!completer.isCompleted) completer.completeError(e, s);
    });
  }
  return completer.future;
}
Он действительно игнорирует любые ошибки на всех других фьючерсах. С другой стороны, он также игнорирует результаты без ошибок, так что я думаю, что это нормально. Нам не хватает способа отменить будущее, когда мы больше не заботимся о результате.