假设我有一个类
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
做类似的事情,即在回调之前需要参数的方法。
非常感谢任何帮助。
答案 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