【问题标题】:Multiple Api requests多个 API 请求
【发布时间】:2016-09-16 11:36:57
【问题描述】:

我将流存储为变量,然后订阅它 3 次。

正如我一开始想象的那样,它会执行一个操作,然后在最后获取它触发的下一个数据,每个人都会得到它的一个更新。这是错误的,因为它为每个订阅者执行一个操作,在这种情况下意味着许多 API 调用。如果我创建一个主题,然后用它订阅观察者并让其他人订阅这个主题,那么它就可以工作。 不幸的是,我是 RP 新手,你能解释一下这里发生了什么吗?

this.listStream = Observable
            .interval(this.refreshInterval)
            .do(() => console.log('call the api 3 times'))
            .map(i => fruitApiStream)
            .startWith(fruitApiStream)
            .flatMap<FruitDto[]>(s => s)
            .map<Fruit[]>(
            s => s.map(s => {
                return new Fruit(s.fruitId, s.name);
            }));

【问题讨论】:

    标签: javascript angular typescript reactive-programming rxjs


    【解决方案1】:

    您在这里遇到的问题是一个典型问题。这种行为是由于默认情况下 rxjs 流是“冷”的。这意味着每个订阅者都将重新启动生产者,因此您会观察到重复。主题很“热”,因此您没有观察到重复。

    您应该在某个时候深入了解流温度隐喻,因为您使用流的次数越多,您就越需要处理这些问题。

    简单的解决方法是使用share 运算符:

    this.listStream = Observable
                .interval(this.refreshInterval)
                .do(() => console.log('call the api 3 times'))
                .map(i => fruitApiStream)
                .startWith(fruitApiStream)
                .flatMap<FruitDto[]>(s => s)
                .map<Fruit[]>(
                s => s.map(s => {
                    return new Fruit(s.fruitId, s.name);
                }))
                .share();
    

    对于类似的问题(和答案),请看这里:

    为了更好地了解热与冷,请看这里:

    有关主题及其语义的详细信息,您可以查看此处:

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2021-07-17
      • 1970-01-01
      • 2021-10-26
      • 2017-10-26
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      相关资源
      最近更新 更多