2016-09-16 115 views
2

我将一个流存储为一个变量,然后订阅它3次。多个Api请求

正如我最初想象的那样,它会执行一个动作,然后在最后得到数据,然后触发它,每个人都会得到它的一个更新。这是错误的,因为它为每个用户执行一个操作,在这种情况下意味着很多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); 
      })); 

回答

0

这里遇到的问题是典型的问题。这种行为是由于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(); 

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

对于更好地了解热与冷,看看这里:

有关明细科目,以及它们的语义,你可以看看这里:

+0

谢谢您的回答! – user1693057