Javascript &引用;“取消订阅”;函数回调/挂接在Observable中;遗嘱执行人;功能
我对“dispose”或“unsubscribe”函数的用途感到困惑,该函数(可选)是从可观察的“executor”函数返回的,如下所示:Javascript &引用;“取消订阅”;函数回调/挂接在Observable中;遗嘱执行人;功能,javascript,rxjs5,Javascript,Rxjs5,我对“dispose”或“unsubscribe”函数的用途感到困惑,该函数(可选)是从可观察的“executor”函数返回的,如下所示: const Rx = require('rxjs'); const obs = Rx.Observable.create(obs => { // we are in the Observable "executor" function obs.next(4); // we return this function, wh
const Rx = require('rxjs');
const obs = Rx.Observable.create(obs => {
// we are in the Observable "executor" function
obs.next(4);
// we return this function, which gets called if we unsubscribe
return function () {
console.log('disposed');
}
});
const s1 = obs.subscribe(
function (v) {
console.log(v);
},
function (e) {
console.log(e);
},
function () {
console.log('complete');
}
);
const s2 = obs.subscribe(
function (v) {
console.log(v);
},
function (e) {
console.log(e);
},
function () {
console.log('complete');
}
);
s1.unsubscribe();
s2.unsubscribe();
让我困惑的是,这样的函数实际上更有可能保留代码中的引用,从而防止垃圾收集
有谁能告诉我在这种情况下返回函数的目的是什么,函数被调用了什么,它的签名是什么?我很难弄清楚有关它的信息
我还看到了从executor函数返回订阅的更为复杂的示例,例如:
let index = 0;
let obsEnqueue = this.obsEnqueue = new Rx.Subject();
this.queueStream = Rx.Observable.create(obs => {
const push = Rx.Subscriber.create(v => {
if ((index % obsEnqueue.observers.length) === obsEnqueue.observers.indexOf(push)) {
obs.next(v);
}
});
return obsEnqueue.subscribe(push);
});
这似乎返回一个订阅,而不仅仅是一个普通函数。有人能解释这是怎么回事吗
明确地说,这样做的区别是什么:
const sub = new Rx.Subject();
const obs = Rx.Observable.create($obs => {
$obs.next(4);
return sub.subscribe($obs);
});
并且不返回订阅调用的结果:
const sub = new Rx.Subject();
const obs = Rx.Observable.create($obs => {
$obs.next(4);
sub.subscribe($obs);
});
当下游不再监听流时,调用
unsubscribe
函数Rx.Observable.create
需要返回该函数,有效地给您时间清理资源
关于你的问题,.subscribe()
返回您可以调用的订阅.unsubscribe()
。因此,如果您想对其他订阅执行某些操作,您可以通过该订阅向下游用户发送:
const obs=Rx.Observable.create($obs=>{
常数计时器=可观测的接收间隔(300)
.do(i=>console.log('emission:'+i))
返回计时器。订阅($obs);
});
obs.take(4).subscribe(i=>console.log('outer-emission:'+i))
我不确定它是否真的被称为“executor”函数,但这是Promissions worldHi标记中的模拟名称,谢谢!在您的第一个代码块中,如果我不返回timer,但保持一切不变,那么事情就会按预期工作(无论是返回timer.do还是只调用timer.do,似乎没有区别,因此不确定您的解释是否100%正确?似乎不返回timer.do调用是可以的(在第一个示例中)?关于第二个例子,我确实看到,即使在4次拍摄之后,发射仍会被记录下来。但是在第一个例子中,如果我们不返回计时器。do things仍然有效!我不明白。嗨,Olegzandr,在第一个例子中,我链接了操作符。因此它不是返回计时器,而是返回subscribe()在计时器上。我更新了示例以使其更清楚。不返回订阅实际上与第二个示例相同。