我以为我理解冷和热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
和B
观察者都能获得值,不仅A
。
我在这里缺少什么?
答案 0 :(得分:1)
它看起来像是RxJs-DOM中的一个错误,你应该打开一个问题。 我相信你可以通过将URL作为字符串文字而不是对象传递来解决这个问题:
return Rx.DOM.jsonpRequest(URL);
编辑:重新阅读来源,我不认为解决方法会起作用。我认为你必须使用defer
解决这个问题:
return Rx.Observable.defer(function () { return Rx.DOM.jsonpRequest({ url: URL }); });