rxjs - 当定时器达到零值时复位
问题描述
我发现了许多如何重置计时器的示例,但它们通常涉及手动重置(例如单击按钮事件)。
我需要一个在倒计时结束时自动重置值的逻辑。
定时器:
type seconds = number;
const getRemainingTime$ = (store: Store): Observable<seconds> => {
// calculate fullTime based on the TriggerDate extracted from the State
// ...
return fullTime$.pipe(
switchMap((fullTime: seconds) =>
timer(0, 1000).pipe(
map((tickCount: number) => fullTime - tickCount),
takeWhile((remainingTime: seconds) => remainingTime >= 0)
)
)
);
}
触发器(等待0
计时器上的值)
getRemainingTime$(this.store).pipe(
skipWhile((remainingTime: seconds) => remainingTime > 0),
)
.subscribe(data => {
const newTriggerDate: Date = new Date(new Date().getTime() + 60 * 1000); // +60 seconds
this.store.dispatch([new SetTriggerDateAction({ newTriggerDate })]);
});
......它不起作用-
当剩余时间为零时,触发器会发疯并调度无限数量的动作。怎么了?
PS:当我手动调度 SetTriggerDateAction(onClick 按钮)时,问题就消失了。
解决方案
替换skipWhile
为filter
.
跳过而
如果 skipWhile 中的条件至少满足一次,则发出所有值。
筛选
仅发出条件中指定的那些值。
推荐阅读
- django - Django,不断重定向到错误的页面
- android - 如何在 android 10 中获取唯一的设备 ID?
- iis - 从 IIS 获取当前正在处理的请求的详细信息
- postgresql - NPgsql 是否支持 OLEDB 与 PostgreSQL 服务器的连接?
- php - 数据库错误 mysqli::real_connect(): (HY000/2002): Connection refused codeingiter
- database - 为列创建数据库索引的时间复杂度是多少?
- laravel - Laravel 中的 store() 和 storeAs() 函数有什么区别?
- bash - 使用 Bash 在不同目录中添加文件行数
- javascript - Javascript 根据媒体查询将不同样式应用于同一元素
- java - 单个枚举中的多个值