我以为我理解冷 Observable 和热 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 变成一个热 Observable,它会像我预期的那样工作,即两个订阅者接收到相同的值。
现在,我明白观察者是冷的,我不应该期望同时收到相同的值,但我希望 A
和 B
观察者接收值,而不仅仅是 A
。
我在这里错过了什么?
最佳答案
它看起来像是 RxJs-DOM 中的错误,您应该提出一个问题。 我相信您可以通过将 URL 作为字符串文字而不是对象传递来解决该错误:
return Rx.DOM.jsonpRequest(URL);
编辑:重新阅读源代码,我认为变通办法行不通。我认为您必须使用 defer
来解决这个错误:
return Rx.Observable.defer(function () { return Rx.DOM.jsonpRequest({ url: URL }); });
关于javascript - 意外的冷 Observable 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28276332/