为什么 switchMap 不取消之前的观察者?
Why switchMap does not cancel previous observer?
我有组件(控制器)中描述的方法:
public requestPassportData(): void {
const th = this;
const data = {
get_scanned_data: true
};
Observable.timer(0, 1000)
.switchMap(() => this.requestMethods.requestPassportData(data))
.takeWhile(() => {
return (
th.formRegister.currentForm().index == 1 ||
th.formRegister.currentForm().index == 2 ||
th.formRegister.currentForm().index == 3
);
})
.subscribe(response => {});
}
如果调用方法requestPassportData()
五次,它会每秒向服务器发送五个请求。为什么switchMap不取消最后一个观察者?
因为每次调用 requestPassportData()
都会创建一个新的 Observable.timer
链,与之前的调用无关。
显然有多种方法可以解决这个问题,但您可以执行以下操作:
private requestPasswordSubject$ = new Subject();
private requestPassword = this.requestPasswordSubject$
.switchMap(() => Observable.timer(0, 1000)
.switchMap(() => this.requestMethods.requestPassportData(data))
.takeWhile(() => {
return (
th.formRegister.currentForm().index == 1 ||
th.formRegister.currentForm().index == 2 ||
th.formRegister.currentForm().index == 3
);
});
)
.subscribe(response => {});
public requestPassportData(): void {
...
this.requestPasswordSubject$.next();
}
实际实施取决于您要实现的目标,但希望您明白与现在的不同之处。
我有组件(控制器)中描述的方法:
public requestPassportData(): void {
const th = this;
const data = {
get_scanned_data: true
};
Observable.timer(0, 1000)
.switchMap(() => this.requestMethods.requestPassportData(data))
.takeWhile(() => {
return (
th.formRegister.currentForm().index == 1 ||
th.formRegister.currentForm().index == 2 ||
th.formRegister.currentForm().index == 3
);
})
.subscribe(response => {});
}
如果调用方法requestPassportData()
五次,它会每秒向服务器发送五个请求。为什么switchMap不取消最后一个观察者?
因为每次调用 requestPassportData()
都会创建一个新的 Observable.timer
链,与之前的调用无关。
显然有多种方法可以解决这个问题,但您可以执行以下操作:
private requestPasswordSubject$ = new Subject();
private requestPassword = this.requestPasswordSubject$
.switchMap(() => Observable.timer(0, 1000)
.switchMap(() => this.requestMethods.requestPassportData(data))
.takeWhile(() => {
return (
th.formRegister.currentForm().index == 1 ||
th.formRegister.currentForm().index == 2 ||
th.formRegister.currentForm().index == 3
);
});
)
.subscribe(response => {});
public requestPassportData(): void {
...
this.requestPasswordSubject$.next();
}
实际实施取决于您要实现的目标,但希望您明白与现在的不同之处。