gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:28:13 26 4
gpt4 key购买 nike

假设我有一个类

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com