我以为我理解冷和热Observable之间的区别,但显然有些东西逃脱了我 . 此代码按预期工作:
var obs = Rx.Observable.interval(2000);
var A = obs.subscribe(function(value) { console.log('A', value) });
var B = obs.subscribe(function(value) { console.log('B', value) });
有了这个,我得到以下结果:
A 0
B 0
A 1
B 1
...
但是当我添加 flatMap
以检索远程JSONP资源时:
var obs = Rx.Observable.interval(2000).flatMap(function() {
return Rx.DOM.jsonpRequest({ url: URL });
})
.map(function(value) { return value.prop; });
var A = obs.subscribe(function(value) { console.log('A', value) });
var B = obs.subscribe(function(value) { console.log('B', value) });
我只收到 A
日志:
A prop
A prop
A prop
...
如果使用 publish().refCount()
将Observable变为热门,它可以正常工作,即两个订阅者都会收到相同的值 .
现在,我明白观察者感冒了,我不应该期望同时收到相同的值,但我希望观察者都能接收到值,而不仅仅是 A
.
我在这里错过了什么?
1 回答
它看起来像RxJs-DOM中的一个错误,你应该打开一个问题 . 我相信你可以通过将URL作为字符串文字而不是对象传递来解决这个问题:
return Rx.DOM.jsonpRequest(URL);
Edit :重新阅读源代码,我不认为解决方法会起作用 . 我认为你必须使用
defer
来解决这个问题: