Вызовы потоковых функций являются асинхронными в Google Dart?

Почему dart вызывает мою функцию «aFunction» после шага 2? Если я выполню этот код, этот текст ниже в консоли:

Шаг 2 Шаг 1

Мой код:

void main()
{
 ...
 stream.listen(aFunction);
 print("Step2");
 ...
}

void aFunction()
{
 print("Step1");
}

Спасибо за помощь.


person Puls    schedule 13.02.2014    source источник
comment
Они являются частью dart:async, но вас смущает их асинхронность?   -  person Damien_The_Unbeliever    schedule 13.02.2014
comment
Потому что ... они асинхронные? Как вы, кажется, знаете, видя, как вы добавили асинхронный тег к своему вопросу? Почему вы ожидаете, что Step1 будет напечатан раньше Step2?   -  person MarioP    schedule 13.02.2014
comment
Из того, что показывает ваш код, мне интересно, почему вообще печатается «Step1». aFunction следует вызывать только тогда, когда stream испускает элемент. Step2 печатается синхронно (сразу).   -  person Günter Zöchbauer    schedule 13.02.2014
comment
Я хочу вызвать свою функцию синхронизации. Возможно?   -  person Puls    schedule 13.02.2014
comment
Ну нет. dartlang.org/articles/event-loop - ›Once 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.2014
comment
Разве aFunction не следует аргументировать?   -  person Florian Loitsch    schedule 13.02.2014


Ответы (2)


Одно из немногих обещаний, которые дает Dart Stream, заключается в том, что он не генерирует никаких событий в ответ на вызов прослушивания. События могут появиться позже, но код, вызывающий "прослушивание", может продолжаться и завершаться до того, как будет запущено первое событие. Изначально мы разрешили потокам запускаться немедленно при прослушивании, но когда мы попытались запрограммировать это, на практике это было совершенно невозможно.

То же самое верно и для прослушивания будущего, например, с «тогда». Обратный вызов никогда не придет сразу.

События обычно должны действовать так, как если бы они были инициированы циклом событий верхнего уровня, поэтому обработчику событий не нужно беспокоиться, запущен ли другой код - другой код, который может быть не реентерабельным.

На практике это не всегда так. Один обработчик событий может запускать другие события через контроллер синхронного потока, эффективно превращая одно событие в другое. Это требует, чтобы обработчик событий знал, что он делает. Синхронные контроллеры предназначены для внутреннего использования внутри, например, преобразователя потока, и использование синхронного контроллера потока в целом не рекомендуется.

Итак, нет, вы не можете сделать так, чтобы вызов listen немедленно запускал обратный вызов.

person lrn    schedule 13.02.2014
comment
Это интересно, я всегда пытался кодировать так, как если бы обратный вызов мог быть вызван напрямую, если обратный вызов уже был запущен. Я, наверное, не правильно сделал, но интересно, что в этом нет необходимости. - person jcoder; 13.02.2014

Вы можете слушать поток синхронно, если вы создали StreamController с включенной опцией синхронизация. Вот пример того, что вы описываете:

var controller = new StreamController<String>(sync: true);
var stream = controller.stream.asBroadcastStream();
stream.listen((text) => print(text));
controller.add("Step1");
print("Step2");
person Manuel Ceron    schedule 03.10.2014