В чем разница между использованием Sink и Pipe с Streams в Dart? - PullRequest
0 голосов
/ 12 марта 2019
import "dart:async";
import "dart:html";

void main() async {
  InputElement addStream = querySelector("#addstream");

  Stream<int> aStream = _someStream();
  StreamController<int> sc = StreamController();

  sc.stream.listen((e) => print(e));

  addStream.onClick.listen((e) {
  sc.sink.addStream(aStream);  // streamcontroller brings in stream through the sink
  // aStream.pipe(sc);   // stream going into streamcontroller through the sink
  });
}

В приведенном выше коде sc.sink.addStream(aStream), кажется, использует метод приемника для добавления aStream к StreamController sc.При этом aStream использует pipe для добавления к StreamController sc.

Оба метода, кажется, делают то же самое.Мне кажется, что использование одного метода над другим - это просто стиль.Если вы используете Stream, pipe, то StreamController.Если вы используете StreamController, потопите Stream.Есть ли конкретная причина использовать один против другого?

1 Ответ

1 голос
/ 13 марта 2019

aStream.pipe(sc) будет close() контроллером потока после завершения потока.С sc.addStream(aStream) контроллер будет по-прежнему открыт после завершения потока, так что вы можете добавить больше событий или других потоков.

В этом случае вызов Stream.pipe будет идентичен sc.addStream(aStream).then((_) sc.close());

...