Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;“取消订阅”;函数回调/挂接在Observable中;遗嘱执行人;功能_Javascript_Rxjs5 - Fatal编程技术网

Javascript &引用;“取消订阅”;函数回调/挂接在Observable中;遗嘱执行人;功能

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

我对“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, 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()在计时器上。我更新了示例以使其更清楚。不返回订阅实际上与第二个示例相同。