#dart
Вопрос:
Беря этот пример из документов Dart. Есть ли способ timedCounter()
вернуть широковещательный поток по определению?
Stream<int> timedCounter(Duration interval, [int? maxCount]) async* {
int i = 0;
while (true) {
await Future.delayed(interval);
yield i ;
if (i == maxCount) break;
}
}
Не ищу timedCounter().asBroadcastStream()
ни с помощью а StreamController
.
Этот вопрос больше касается того, является ли синтаксис определения функции async*
ограничивающим поток результатов одной подпиской.
Ответ №1:
Нет.
Stream
Созданный async*
функцией поток всегда является потоком с одной подпиской. Если вам нужен широковещательный поток, либо используйте .asBroadcastStream()
, либо, предпочтительно, используйте контроллер широковещательного потока напрямую.
async*
Функция предназначена для нормального выполнения до тех пор, пока она не будет выполнена, управляемая обычным потоком управления одной (асинхронной) функцией.
Широковещательные потоки обычно используются для запуска событий в ответ на другие происходящие события. Хотя вы можете сделать что-то подобное с помощью async*
функции, на самом деле очень легко ошибиться (например, не поймать ошибку и завершить поток до того, как вы это сделаете). Так что, по крайней мере на данный момент, async*
потоки являются одноподписными. (Если бы я мог это изменить, я бы сделал их многопользовательскими, как конструктор, где каждое прослушивание получает свою собственную последовательность событий, начиная с нуля, а не широковещательный Stream.multi
поток, в котором слушатели разделяют одни и те же события).