意外的冷Observable行为

时间:2015-02-02 11:05:05

标签: javascript reactive-programming rxjs

我以为我理解冷和热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变为热门,它会按照我的预期运行,即两个订阅者都会收到相同的值。

现在,我明白观察者感冒了,我不应该期望同时收到相同的值,但我希望AB观察者都能获得值,不仅A

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

它看起来像是RxJs-DOM中的一个错误,你应该打开一个问题。 我相信你可以通过将URL作为字符串文字而不是对象传递来解决这个问题:

return Rx.DOM.jsonpRequest(URL);

编辑:重新阅读来源,我不认为解决方法会起作用。我认为你必须使用defer解决这个问题:

return Rx.Observable.defer(function () { return Rx.DOM.jsonpRequest({ url: URL }); });