#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());