2016-03-28 7 views
4

rxjs 4.xではRx.Observable.fromCallbackがスコープを2番目のパラメータとして受け取りますが、5.0ではこのメソッドはRx.Observable.bindCallbackに変更されていますacceptスコープパラメータ。 bindCallbackにスコープパラメータを追加する方法。たとえば、ES6の場合。Rx.Observable.bindCallback(範囲はrxjs内)

class Test { 
    constructor(input) { 
    this.input = input; 
    } 

    callback(cb) { 
    return cb(this.input); 
    } 

    rx() { 
    // this works on rx 4.x 
    // var observable = Rx.Observable.fromCallback(this.callback, this)(); 

    // this doesn't work, because this.callback function doesn't use original this, so cannot get this.input 
    var observable = Rx.Observable.bindCallback(this.callback)(); 

    // Work around: Rx.Observable.bindCallback(this.callback)(); 
    // var me = this; 
    // var observable = Rx.Observable.bindCallback((cb) => {me.callback(cb);})(); 

    observable.subscribe(
     input => console.log('get data => ' + input), 
     err => console.log('get error =>' + err), 
    () => console.log('complete') 
    ); 
    } 
    } 

    new Test(100).rx(); 

答えて

1

私はこれを行う方法を示してhttp://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindCallbackの例があり、コンストラクタ

constructor(input) { 
    this.input = input; 
    this.callback = this.callback.bind(this) 
    } 
+1

これは別の回避策です。実際には、bindを介して元の関数 'callback'を書き換えます。別の言葉では、私が 'bindCallback'で使う複数の関数を持っていれば、コンストラクタの関数にこれをバインドする必要があります。 –

3

にこれを追加するときには、私のために動作します。オブジェクトメソッド

const boundMethod = Rx.Observable.bindCallback(someObject.methodWithCallback); boundMethod.call(someObject) // make sure methodWithCallback has access to someObject .subscribe(subscriber);

使用bindCallbackあなたは、変数を宣言しなくても、すぐにそれを呼び出し、またこのような引数を渡すことができます。

Rx.Observable.bindCallback(someObject.callback).call(someObject,<args>) 

に非常にthisにバインドするには、

Rx.Observable.bindCallback(this.callback).call(this,<args>) 
+0

または 'const mine = Rx.Observable.bindCallback(someObject.callback.bind(someObject)); mine.subscribe(console.info) ' – DarkNeuron