2016-03-28 3 views
4

Кажется, что в rxjs 4.x, Rx.Observable.fromCallback принимает область действия как второй параметр, но в 5.0 этот метод изменен на Rx.Observable.bindCallback и не принять параметр области. Как добавить параметр scope в 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

Это работает для меня, когда я добавляю это конструктору

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

Это еще одна работа вокруг. На самом деле вы переписываете исходную функцию 'callback' через bind. Другими словами, если у меня есть несколько функций для использования в 'bindCallback', я должен привязать это к тем функциям в конструкторе. –

3

Существует пример в http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-bindCallback, который показывает, как это сделать.

Использование bindCallback по методу объекта

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

Так bind to this Вы можете просто позвонить:

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

Или 'const my = Rx.Observable.bindCallback (someObject.callback.bind (someObject)); mine.subscribe (console.info) ' – DarkNeuron

Смежные вопросы