我有以下代码,在其中我想重写next以具有一些自定义逻辑。它不能以这种方式工作,但只有当next是一个带有箭头函数的属性时才能工作。它背后的原因是什么?
export class Store<T> extends ReplaySubject<T | undefined> {
next(value?: T) {
console.log("do something in my code");
super.next(value);
}
}export class Store<T> extends ReplaySubject<T | undefined> {
next = (value?: T) => {
console.log("do something in my code");
super.next(value);
};
}https://stackblitz.com/edit/typescript-override-subject-next
发布于 2021-02-13 14:55:47
Subject (和可观察对象)使用像next这样的方法获取观察者对象
const observer = {
next: () => {},
error: () => {},
complete: () => {},
};您可以将此对象提供给主题(最好是可观察的),而不是扩展它:
const subject = new Subject();
const observer = {
next: (val) => { ... custom logic };
< ... >
}
subject.asObservable().subscribe(observer);发布于 2021-10-24 12:53:53
今天,我还扩展了ReplaySubject来获得最后一个值。为此,我提出了一个PR- https://github.com/ReactiveX/rxjs/pull/6652/files,但为了在我的项目中解决这个问题,同时,我扩展了ReplaySubject,同样的事情也发生在我身上;next没有被覆盖。
我把自己逼疯了为什么会发生这样的事情。我跳到源代码中,看到在RxJS 6.x版本中,next方法id被函数赋值- https://github.com/ReactiveX/rxjs/blob/6.6.7/src/internal/ReplaySubject.ts#L31所覆盖,这就是它没有被覆盖的原因。
跟踪同一文件的历史,我发现在这个commit- https://github.com/ReactiveX/rxjs/commit/f1dcada1e1838ffb01cd0dac60340c6fa068f3cf#diff-a287f66fc20bf26caa2f42935756aa6a094f400e91d6b4a388aee4e4e11675c4中,这个行为在v7.x (具体来说是7.0.0-beta.6)中发生了变化。
因此您必须升级到RxJS 7.x版本才能使其正常工作。
如果您无法升级到7.x版本-以下是解决方法-
export class Store<T> extends ReplaySubject<T | undefined> {
private originalNext: any;
constructor(bufferSize: number, windowTime: number) {
super(bufferSize, windowTime);
this.originalNext = super.next;
this.next = this.emit;
}
private emit(value?: T): void {
console.log("do something in my code");
super.next(value);
};
}干杯!
https://stackoverflow.com/questions/66182459
复制相似问题