В чем разница между использованием Sink и Pipe с потоками в Dart?

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. Есть ли особая причина использовать один против другого?


person rchkm    schedule 12.03.2019    source источник
comment
Обратите внимание, что sc.sink совпадает с sc. Итак, sc.sink.addStream(aStream) совпадает с sc.addStream(aStream);.   -  person Nate Bosch    schedule 13.03.2019


Ответы (1)


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

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

person Nate Bosch    schedule 12.03.2019