RxJs javascript - bindNodeCallback与Object方法函数,需要输入参数

时间:2018-03-01 21:42:37

标签: javascript typescript rxjs

假设我有一个类

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/bindNodeCallback';

export class MyClass {
    name: string;

    doSomethingWithName(cb: (err) => void) {
        const error = 'I have no name';
        const success = 'My name is: ' + this.name;
        if (!this.name) {
            return cb(error)
        }
        return cb(success);
    }

    doSomethingWithNameAndParam(param: string, cb: (err) => void) {
        const error = 'I have no name and param value is: ' + param;
        const success = 'My name is: ' + this.name + ' and my param value is :' + param;
        if (!this.name) {
            return cb(error)
        }
        return cb(success);
    }

}

MyClass定义了一些方法,这些方法期望将回调作为其最后一个参数。

我想使用 rxjs.Observable bindNodeCallback方法创建一个返回 Observable 的函数,而不是回调。

第一种方法的一切正常,即不期望除回调之外的其他参数的方法。这是返回Observable

的代码
export function myClassObjFunctionObs(myObj: MyClass): Observable<MyClass> {
    return Observable.bindNodeCallback(myObj.doSomethingWithName).call(myObj);
}

这是使用Observable的代码

import {MyClass} from './my-class';
import {myClassObjFunctionObs} from './my-class';

const myClass = new MyClass();
myClass.name = 'I am your class';

myClassObjFunctionObs(myClass)
.subscribe(
    data => console.log('data', data),
    err => console.error(err),
    () => console.log('DONE')
)

我的问题是我不知道如何使用方法doSomethingWithNameAndParam做类似的事情,即在回调之前需要参数的方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

这是绑定参数的最简单明了的方法:

export function myClassObjFunctionObs(myObj: MyClass): Observable<MyClass> {
    return Observable.bindNodeCallback(myObj.doSomethingWithNameAndParam.bind(myObj, 'TEST PARAM')).call(myObj);
}

此外,您可以考虑将doSomethingWithNameAndParam函数更改为一个包装器,其中包含一个用于调用param并返回doSomething函数的闭包:

doSomethingWithNameAndParam(param: string) {
    return (cb: (err) => void) => {
      const error = 'I have no name and param value is: ' + param;
      const success = 'My name is: ' + this.name + ' and my param value is :' + param;
      if (!this.name) {
          return cb(error)
      }
      return cb(success);
    }
}

然后你就可以做到:

export function myClassObjFunctionObs(myObj: MyClass): Observable<MyClass> {
    return Observable.bindNodeCallback(myObj.doSomethingWithNameAndParam('TEST PARAM')).call(myObj);
}

这是一个stackblitz:https://stackblitz.com/edit/angular-za2y2k