【发布时间】:2018-01-26 08:12:21
【问题描述】:
我正在处理一个 Angular 项目,但我不完全理解为什么这段代码 sn-p 没有按预期工作:
const httpObs = Rx.Observable.of("")
.do(() => console.log("trigger http call")) //only triggered once
.publishReplay(1).refCount();
let observable = Rx.Observable.timer(0,1000)
.do((e) => console.log("new event: " + e))
.switchMap(() => this.httpObs);
const c1 = observable.subscribe(() => console.log("subscriber 1"));
const c2 = observable.subscribe(() => console.log("subscriber 2"));
我不明白为什么 Rx.Observable.timer 发出的每个事件都不会触发“触发 http 调用”。我的期望是,只要一个订阅者订阅了 observable,每个发出的事件都会触发 http 调用。但是,每个订阅者都会收到相同的排放,这意味着每个事件只有一个 http 调用。
我知道我可以通过在 observable 上使用 publishReplay + refcount 来修复它(见下文),但这仅适用于这个简单的示例。
我真正尝试实现的是两个组件使用相同的 http 调用响应,并且每个组件都会发出一个 onInit 事件,然后将其 switchMapped 到 http-response。我不希望每个新订户都触发呼叫。但是,我希望在发出另一个事件时触发调用。 onInit observable 与 click-observable 合并,只要用户点击“更新”按钮,它就会在 switchMap 操作符用于转换之前发出新事件。现在的问题是,更新按钮不再触发 http 调用。
这个例子展示了它应该如何表现:
const httpObs = Rx.Observable.of("")
.do(() => console.log("trigger http call"));
let observable = Rx.Observable.timer(0,1000)
.do((e) => console.log("new event: " + e))
.switchMap(() => this.httpObs)
.publishReplay(1);
observable.subscribe(() => console.log("subscriber 1"));
observable.subscribe(() => console.log("subscriber 2"))
observable.connect();
【问题讨论】:
标签: javascript rxjs reactive-programming