首页 文章

意外的冷Observable行为

提问于
浏览
4

我以为我理解冷和热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 回答

  • 1

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

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

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

相关问题