Одно из немногих обещаний, которые дает Dart Stream, заключается в том, что он не генерирует никаких событий в ответ на вызов прослушивания. События могут появиться позже, но код, вызывающий "прослушивание", может продолжаться и завершаться до того, как будет запущено первое событие. Изначально мы разрешили потокам запускаться немедленно при прослушивании, но когда мы попытались запрограммировать это, на практике это было совершенно невозможно.
То же самое верно и для прослушивания будущего, например, с «тогда». Обратный вызов никогда не придет сразу.
События обычно должны действовать так, как если бы они были инициированы циклом событий верхнего уровня, поэтому обработчику событий не нужно беспокоиться, запущен ли другой код - другой код, который может быть не реентерабельным.
На практике это не всегда так. Один обработчик событий может запускать другие события через контроллер синхронного потока, эффективно превращая одно событие в другое. Это требует, чтобы обработчик событий знал, что он делает. Синхронные контроллеры предназначены для внутреннего использования внутри, например, преобразователя потока, и использование синхронного контроллера потока в целом не рекомендуется.
Итак, нет, вы не можете сделать так, чтобы вызов listen немедленно запускал обратный вызов.
person
lrn
schedule
13.02.2014
dart:async
, но вас смущает их асинхронность? - person Damien_The_Unbeliever   schedule 13.02.2014Step1
будет напечатан раньшеStep2
? - person MarioP   schedule 13.02.2014aFunction
следует вызывать только тогда, когдаstream
испускает элемент.Step2
печатается синхронно (сразу). - person Günter Zöchbauer   schedule 13.02.2014Once a Dart function starts executing, it continues executing until it exits. In other words, Dart functions can’t be interrupted by other Dart code.
Другими словами , все, что должно произойти послеprint("Step1")
, должно быть добавлено вaFunction()
. - person MarioP   schedule 13.02.2014aFunction
не следует аргументировать? - person Florian Loitsch   schedule 13.02.2014