Как я могу узнать, когда два потока выполнены?

Я использую потоки Dart для асинхронных событий. У меня есть два потока, и я хочу знать, когда оба потока будут завершены (или закрыты). Я хотел бы сделать это с фьючерсами. Как это сделать?


person Seth Ladd    schedule 11.10.2013    source источник


Ответы (1)


StreamSubscription может вернуть Future с asFuture. Когда поток закрывается, будущее подписки завершается.

Используйте Future.wait, чтобы дождаться завершения фьючерсов обоих потоков.

Вот пример:

import 'dart:async';

Future listenOnTwoStreams(Stream s1, Stream s2) {
  StreamSubscription sub1 = s1.listen((e) => print(e));
  StreamSubscription sub2 = s2.listen((e) => print(e));
  
  Future f1 = sub1.asFuture();
  Future f2 = sub2.asFuture();
  
  return Future.wait([f1, f2]).then((e) => print("all done!"));
}

void main() {
  StreamController controller1 = StreamController();
  StreamController controller2 = StreamController();
  
  Stream s1 = controller1.stream;
  Stream s2 = controller2.stream;
  
  listenOnTwoStreams(s1, s2);
  
  Timer.run(() {
    controller1.add("1");
    controller2.add("2");
    
    controller1.close();
    controller2.close();
  });
}
person Seth Ladd    schedule 11.10.2013
comment
Да, это способ сделать это. - person Justin Fagnani; 11.10.2013
comment
@FlorianLoitsch, можете ли вы отредактировать ответ или создать новый ответ с правильной обработкой ошибок? - person Seth Ladd; 24.10.2013