2016-11-12 5 views
3

私はこれらの2つのオブジェクトを持っており、イベントのリスニングを停止したいと考えています。私はobservablesとRxJSに全く慣れず、ただInquirerライブラリで作業しようとしています。ここでRxJS Observablesからの退会

は、参考のためにRxJS APIです: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html

はどうすれば観測のこれらのタイプから退会できますか?

ConnectableObservable:

FilterObservable:

FilterObservable { 
    source: 
    RefCountObservable { 
    source: 
     ConnectableObservable { 
     source: [Object], 
     _connection: [Object], 
     _source: [Object], 
     _subject: [Object] }, 
    _count: 1, 
    _connectableSubscription: ConnectDisposable { _p: [Object], _s: [Object] } }, 
    predicate: [Function] } 

私は、これらのオブジェクトから解除する必要があります。

'use strict'; 
var rx = require('rx'); 

function normalizeKeypressEvents(value, key) { 
    return {value: value, key: key || {}}; 
} 

module.exports = function (rl) { 

    var keypress = rx.Observable.fromEvent(rl.input, 'keypress', normalizeKeypressEvents) 
    .filter(function (e) { 
     // Ignore `enter` key. On the readline, we only care about the `line` event. 
     return e.key.name !== 'enter' && e.key.name !== 'return'; 
    }); 

    return { 
    line: rx.Observable.fromEvent(rl, 'line'), 

    keypress: keypress, 

    normalizedLeftKey: keypress.filter(function (e) { 
     return e.key.name === 'left'; 
    }).share(), 

    normalizedRightKey: keypress.filter(function (e) { 
     return e.key.name === 'right'; 
    }).share(), 

    normalizedUpKey: keypress.filter(function (e) { 
     return e.key.name === 'up' || e.key.name === 'k' || (e.key.name === 'p' && e.key.ctrl); 
    }).share(), 

    normalizedDownKey: keypress.filter(function (e) { 
     return e.key.name === 'down' || e.key.name === 'j' || (e.key.name === 'n' && e.key.ctrl); 
    }).share(), 

    numberKey: keypress.filter(function (e) { 
     return e.value && '123456789'.indexOf(e.value) >= 0; 
    }).map(function (e) { 
     return Number(e.value); 
    }).share(), 

    spaceKey: keypress.filter(function (e) { 
     return e.key && e.key.name === 'space'; 
    }).share(), 

    aKey: keypress.filter(function (e) { 
     return e.key && e.key.name === 'a'; 
    }).share(), 

    iKey: keypress.filter(function (e) { 
     return e.key && e.key.name === 'i'; 
    }).share() 
    }; 
}; 

私の現在の最良の推測ではありませんということです購読する明示的な呼び出しは次のように起こっている:

var source = Rx.Observable.fromEvent(input, 'click'); 

var subscription = source.subscribe(
    function (x) { 
    console.log('Next: Clicked!'); 
    }, 
    function (err) { 
    console.log('Error: %s', err); 
    }, 
    function() { 
    console.log('Completed'); 
    }); 

ではなく、これらの呼び出しがあります。

events.normalizedUpKey.takeUntil(validation.success).forEach(this.onUpKey.bind(this)); 
events.normalizedDownKey.takeUntil(validation.success).forEach(this.onDownKey.bind(this)); 

ので、私の最高の推測では、私はキャンセル/ takeUntil呼び出しを無効にする方法が必要だということです。

答えて

10

登録を解除する場合は、Subscriptionオブジェクトが必要です。それはすべてのObservable.subscribe()呼び出しから返されたオブジェクトです。たとえば:詳細情報については

let subscriber = Observable.subscribe(...); 
... 
subscriber.unsubscribe(); 

は、以下を参照してください。https://github.com/ReactiveX/rxjs/blob/master/doc/subscription.md

+0

ええ、その呼び出しが上記のコードのいずれかで内部的に起こっているかどうかを知ることができますか?私が作業しているコードが、実際には観察可能なイベントを購読していることは明らかです。コード内で明示的なsubscribe()呼び出しは表示されません。 –

+0

たとえば、rx.Observable.fromEvent()ここで仕事をしていますが、どうやって止めるのか分かりません! –

+0

これはビット=> https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.mdに役立ちます –

2

私は2番目の最初のコメンターが言っていたもの。

let subscription = normalizedUpKey.subscribe(data => console.log('data')); 

あなたが

subscription.unsubscribe() 

を行うことができます:それはコードでこのどこかのような呼び出しが必要であると感じているが 。何が起こったのか、それとも第三者の図書館の一部なのか、どうやって知っていますか?

Rxjsについてもっと読む。私はあなたがこの無料の本を見てみることをお勧めしますhttps://www.gitbook.com/book/chrisnoring/rxjs-5-ultimate/details

関連する問題