【问题标题】:When do Stream start publishing values to listeners?Stream 何时开始向侦听器发布值?
【发布时间】:2019-06-21 11:12:25
【问题描述】:

在阅读了一堆关于 dart 中的 Streams 和 StreamControllers 的文档后,我尝试构建一个小示例,结果令我感到惊讶。我读过的所有文档都指出,一旦注册了侦听器,流就会开始发出数据。但这并没有显示任何打印数据:

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

在创建流和添加数据时,是否所有“下沉”数据都计划在下一个应用程序步骤中发出?

干杯。

【问题讨论】:

    标签: dart stream reactive-programming


    【解决方案1】:

    您是对的,文档指出您侦听流以使其开始生成事件。但是,流是异步的,因此当您调用 listen() 方法时,您正在注册以在将来的某个时间从流中接收事件。然后 Dart 将继续运行 main 函数的其余部分。致电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
    

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2012-04-01
      • 2020-03-06
      相关资源
      最近更新 更多