[英]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.