繁体   English   中英

为每个订户评估rxjs map运算符

[英]rxjs map operator evaluated for each subscriber

为什么为每个订户评估地图运营商而不是一次?

const obs1 = Rx.Observable.interval(1000).take(1).map((x, i) => {
  console.log(i+1 + ':1 map')
  return 'obs1';
})

const obs2 = Rx.Observable.interval(1300).take(1).map((x, i) => {
  console.log(i+1 + ':2 map')
  return 'obs2';
})

const obs3 = Rx.Observable.interval(1700).take(2).map((x, i) => {
  console.log(i+1 + ':3 map')
  return 'obs3';
})

const view = obs1.combineLatest(obs2, obs3, (obs1, obs2, obs3) => {                 return obs1 + ', ' + obs2 + ', ' + obs3; });

// Every subscriber adds more calls to map - why is it called multiple     times at the same time ?

view.subscribe((value) => {
  console.log('sub1: ' + value)
});

view.subscribe((value) => {
  console.log('sub2: ' + value)
});

view.subscribe((value) => {
  console.log('sub3: ' + value)
});

我在这里创建了一个测试用例: http ://jsbin.com/jubinuf/3/edit?js, console

我可以用不同的方式编写此测试用例以避免此行为吗?

每个订阅者都将运行Observable序列。 如果您希望每个人都获得结果流,请使用.publish().refCount()

http://jsbin.com/ditikonopi/edit?js,console

.publish()将返回一个可观察序列,该序列共享对基础序列的单个订阅。 只要至少有一个订阅, refCount()将保持与源的连接。

凯尔的回答是正确的。 应用于所有三个observable的publish().refCount()将导致不重新执行map选择器函数。

要详细说明该答案,了解使用Rxjs时hot和cold observable之间的区别很有用。 在你的情况,你的所有观测obsX是冷的,所以他们的订阅“重新启动”。 combineLatest在引擎盖下订阅所有3,这就是为什么map被重新执行。 看看这里的插图说明。 这对于初学者来说是一个常见的绊脚石,但它很容易理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM