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

#dart #stream #pipe #sink

#dart #поток #труба #sink

Вопрос:

 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) похоже, используется метод sink для добавления aStream в StreamController sc.
При этом aStream используется pipe для добавления в StreamController sc .

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

Комментарии:

1. Обратите внимание, что sc.sink это то же самое, что sc . Так sc.sink.addStream(aStream) это то же самое, что sc.addStream(aStream);

Ответ №1:

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

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