假设我有一个类,例如
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
(即在回调之前需要参数的方法)执行类似的操作。
任何帮助将不胜感激。
最佳答案
这是绑定(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/