Когда Stream начинает публиковать значения для слушателей? - PullRequest
0 голосов
/ 21 июня 2019

Прочитав кучу документации о Streams и StreamControllers в dart, я попытался создать небольшой пример и был удивлен результатами. Вся прочитанная мною документация гласит, что поток начинает излучать данные, как только слушатель зарегистрирован. Но это не показывает никаких печатных данных:

class Order
{
  String type;
  Order(this.type);
}

class Pizza
{

}



void main()
{
  Order order = Order("pzza");

  final StreamController sc = StreamController();

  sc.sink.add(order);
  sc.sink.add(order);
  sc.sink.add(new Order("pizza"));

  Stream st = sc.stream.map((order) {
    return order.type;
  })
  .map((orderType) {
    if(orderType == "pizza")
      return Pizza();
    else
      throw ("dude!, I don't know how to do that");
  });

  var sus = st.listen((pizza)
    {
      print("We did a pizza");
    },
    onError: (error)
    {
      print(error);
    });

    sus.cancel();

    sc.sink.add(new Order("pizza2"));
}

Я ожидал этого вывода:

dude!, I don't know how to do that
dude!, I don't know how to do that
We did a pizza

При создании потоков и добавлении данных все «утопленные» данные планируются для отправки на следующем шаге приложения?

Приветствие.

1 Ответ

0 голосов
/ 21 июня 2019

Вы правы в том, что в документации говорится, что вы слушаете поток, чтобы он начал генерировать события. Однако потоки асинхронны, поэтому при вызове метода listen() вы регистрируетесь для получения событий из потока в какой-то момент в будущем. Затем Дарт продолжит выполнение оставшейся части основной функции. Сразу после звонка listen() вы звоните cancel(), чтобы отменить подписку, поэтому ничего не печатается.

Если вы удалите или закомментируете отмену и запустите ее снова, вы увидите ожидаемый результат.

Слегка измененная версия вашего кода, мы надеемся, подсвечивает ход событий:

class Order {
  String type;
  Order(this.type);
}

class Pizza {}

void main() {
  print("Main starts");

  Order order = Order("pzza");

  final StreamController sc = StreamController();

  sc.sink.add(order);
  sc.sink.add(order);
  sc.sink.add(new Order("pizza"));

  Stream st = sc.stream.map((order) {
    return order.type;
  }).map((orderType) {
    if (orderType == "pizza")
      return Pizza();
    else
      throw ("dude!, I don't know how to do that");
  });

  var sus = st.listen((pizza) {
    print("We did a pizza");
  }, onError: (error) {
    print(error);
  });

  // sus.cancel();

  sc.sink.add(new Order("pizza2"));

  print("Main ends");
}

Запуск этого приводит к выводу:

Main starts
Main ends
dude!, I don't know how to do that
dude!, I don't know how to do that
We did a pizza
dude!, I don't know how to do that
...