javascript - RxJs javascript - 带有需要输入参数的对象方法函数的bindNodeCallback

标签 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.ObservablebindNodeCallback方法来创建一个函数,该函数返回一个我可以使用的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(即在回调之前需要参数的方法)执行类似的操作。

任何帮助将不胜感激。

最佳答案

这是绑定(bind)参数的最简单、最明显的方法:

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

此外,您还可以考虑将 doSomethingWithNameAndParam 函数更改为带有闭包的包装器,该闭包对参数进行柯里化(Currying)并返回 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);
}

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

关于javascript - RxJs javascript - 带有需要输入参数的对象方法函数的bindNodeCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49059156/

相关文章:

javascript - <div> 部分的可变背景

typescript - @typescript-eslint/typedef 启用调用签名

angular - Typescript - 执行文件中的代码而不导入它们

javascript - RxJS ReplaySubject 观察者长度在下一个之后不会增加

rxjs - 创建递归 Observable 循环?

javascript - 获取 express 编码的 cookie 作为 header 值

javascript - 页眉不符合 100% 宽度

reactjs - 在构造函数或声明中初始化变量

angular - rxjs map参数是整个数组

javascript - JS 脚本加载与 HTML 中的 &lt;script&gt; 标签