RxJs javascript - bindNodeCallback和一个需要输入参数的Object方法函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RxJs javascript - bindNodeCallback和一个需要输入参数的Object方法函数相关的知识,希望对你有一定的参考价值。
假设我有一个类如
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
做类似的事情,即在回调之前需要参数的方法。
任何帮助将非常感谢。
答案
这是绑定param最简单明了的方法:
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
以上是关于RxJs javascript - bindNodeCallback和一个需要输入参数的Object方法函数的主要内容,如果未能解决你的问题,请参考以下文章