Rx.Observable.bindCallback 范围在 rxjs 中

Rx.Observable.bindCallback with scope in rxjs

在rxjs中好像4.x,Rx.Observable.fromCallback接受scope作为第二个参数,但是在5.0中,这个方法改为Rx.Observable.bindCallback,不接受scope参数。如何在 bindCallback 中添加范围参数。例如在 ES6.

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();

当我将它添加到构造函数时,它对我有用

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

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindCallback 中有一个示例说明如何执行此操作。

Use bindCallback on object method

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

你可以在不声明变量的情况下立即调用它,也可以像这样传递参数:

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

因此,要绑定到 this,您只需调用

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