订阅后重置 Rx Js fromEvent observable
Reset Rx Js fromEvent observable after subscribe
我有 mousemove 事件:
fromEvent(document, 'mousemove').pipe(
filter(e => e.target !== this.formElement.nativeElement),
filter(_ => this.form.valid),
take(1),
mergeMap((): any => this.confirm()),
).subscribe();
confirm() {
this.snack.open('sure', 'yes').onAction()
.subscribe(_ => {
this.createNoteService.create();
})
}
确认点心按钮后,我希望鼠标事件再次开始工作。
可能吗?谢谢!
这只对你第一次有效的原因是因为你有 take(1)
在收到一个值后结束 observable。
此外,您的 confirm()
方法应该 return 可观察;不要在函数内部订阅; mergeMap
将自动为您订阅/取消订阅。
但是,您可以使用 exhaustMap
而不是 mergeMap
。这将一次只允许一个内部订阅。它将忽略任何传入的排放,直到其当前源完成:
fromEvent(document, 'mousemove').pipe(
filter(e => e.target !== formElement.nativeElement),
filter(_ => form.valid),
exhaustMap(() => confirm()),
).subscribe();
function confirm() {
return snack.open('sure', 'yes').onAction().pipe(
tap(() => this.createNoteService.create())
);
}
我有 mousemove 事件:
fromEvent(document, 'mousemove').pipe(
filter(e => e.target !== this.formElement.nativeElement),
filter(_ => this.form.valid),
take(1),
mergeMap((): any => this.confirm()),
).subscribe();
confirm() {
this.snack.open('sure', 'yes').onAction()
.subscribe(_ => {
this.createNoteService.create();
})
}
确认点心按钮后,我希望鼠标事件再次开始工作。
可能吗?谢谢!
这只对你第一次有效的原因是因为你有 take(1)
在收到一个值后结束 observable。
此外,您的 confirm()
方法应该 return 可观察;不要在函数内部订阅; mergeMap
将自动为您订阅/取消订阅。
但是,您可以使用 exhaustMap
而不是 mergeMap
。这将一次只允许一个内部订阅。它将忽略任何传入的排放,直到其当前源完成:
fromEvent(document, 'mousemove').pipe(
filter(e => e.target !== formElement.nativeElement),
filter(_ => form.valid),
exhaustMap(() => confirm()),
).subscribe();
function confirm() {
return snack.open('sure', 'yes').onAction().pipe(
tap(() => this.createNoteService.create())
);
}