我有一个可以观察表选择事件的观察,它也很热。
代码段:
const oTableRowSelect$ = TableOb.rowSelectionChangeEvent$(this.getById("ins-table"));
const test = oTableRowSelect$
.do(function () {
console.log("resubscribe");
})
.map(function () {
return 4;
});
test.subscribe(function (o) {
console.log("Select1" + o);
});
test.subscribe(function (o) {
console.log("Select2" + o)
});
正如您所看到的,有两个订阅者可以监听该事件。因此,结果应该分享给所有订户,即所谓的重播效果。
但我期待resubscribe
仅输出一次。我做错了什么?
答案 0 :(得分:1)
虽然您的oTableRowSelect$
可能热并且已共享,但它只会在您使用其他运算符以某种方式扩展它的部分(在您的情况下{{1})中共享}和do
)。
在RxJS中,通过运算符的任何扩展基本上都会返回" new" 流。
为了使此"新" 流热/共享,您必须应用使其变热的运算符(map
,share
,publish
,等等......)
publishReplay

const hotBaseStream$ = new Rx.BehaviorSubject("Hi!");
const test = hotBaseStream$
// -------- below this line you get a "new" stream, that is not hot any more
.do(() => console.log("resubscribe"))
.map(() => 4)
.publishReplay().refCount(); // remove this part and you will have back your original behavior
test.subscribe(function (o) {
console.log("Select1 ", o);
});
test.subscribe(function (o) {
console.log("Select2 ", o)
});