javascript - 意外的冷 Observable 行为

标签 javascript reactive-programming rxjs

我以为我理解冷 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,它会像我预期的那样工作,即两个订阅者接收到相同的值。

现在,我明白观察者是冷的,我不应该期望同时收到相同的值,但我希望 AB 观察者接收值,而不仅仅是 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/

相关文章:

javascript - 无法在 javascript 上打开多个模态图像

javascript - 是否可以在不同浏览器中使用 Redux 中的状态来实现响应性?

Angular CanDeactivate Guard : How to wait for the right or the next value of an Obersavble?

angular - RxJS distinctUntilChanged - 对象比较

Angular 6 - 一个输入中的更改值更改多个输入中的值

angular - 使用 Router.navigate() 后未调用 Observable.subscribe()

javascript - 如何显示对 AJAX/getJSON 请求的错误(文本/html)响应?

javascript - 如何改进这段代码(数组数据过滤)

javascript - 尝试迭代 Map 元素时出现 TypeError

r - 响应式(Reactive)过滤数据以生成 map