【发布时间】:2021-05-18 07:14:57
【问题描述】:
我有一个可观察的,在单击开始按钮后每秒向控制台打印一个数字。单击开始按钮 5 秒后,可观察对象应停止打印。
开始条件 单击开始按钮后的每一秒
结束条件 点击开始按钮五秒后
不起作用的代码
const startClick$ = fromEvent(document.getElementById('start'), 'click');
const stop$ = startClick$.pipe(switchMapTo(interval(5000)));
const printInterval$ = interval(1000).pipe(takeUntil(stop$));
const startPrint$ = startClick$.pipe(switchMapTo(printInterval$));
startPrint$.subscribe(
value => {
console.log('new value is:', value);
},
() => {
console.log('there was some error!');
},
() => {
console.log('i have completed');
}
);
stop$.subscribe(() => {
console.log('i should stop right now!!');
});
在点击开始按钮五秒后,startPrint$ Observable 不会停止发射。
有效的代码
const endClick$ = fromEvent(document.getElementById('end'), 'click');
const stopWithEndClick$ = endClick$.pipe(switchMapTo(interval(5000)));
const printInterval1$ = interval(1000).pipe(takeUntil(stopWithEndClick$));
const startPrint1$ = startClick$.pipe(switchMapTo(printInterval1$));
startPrint1$.subscribe(
value => {
console.log('1: new value is:', value);
},
() => {
console.log('1: there was some error!');
},
() => {
console.log('1: i have completed');
}
);
stopWithEndClick$.subscribe(() => {
console.log('1: i should stop right now!!');
});
这里我有另一个按钮end,我会在点击结束按钮 5 秒后等待。在这种情况下,observable 会按预期停止发射。
我怎样才能使第一个案例工作,我在这里犯了任何错误吗?完整的工作代码可以在https://stackblitz.com/edit/take-until-issue?file=index.ts找到。
【问题讨论】:
-
``` const printInterval$ = interval(1000).pipe(takeUntil(stop$)); ```这行有一个奇怪的操作,不工作。如果您在最终订阅中修改为像这样使用 takeUntil ``` startPrint$.pipe(takeUntil(stop$)) ```,它可以与您的链的其他修改一样完美地工作。
-
这不会在五秒后完成外部观察吗?单击开始按钮后,我想每秒在控制台上打印一个数字。
标签: javascript rxjs observable takeuntil