关于TimerObservable(0,1)未返回毫秒值的技术咨询
关于TimerObservable的两个常见问题解答
首先得明确一个核心点:TimerObservable的输出并不是当前时间的毫秒值,而是从0开始递增的整数序列——这是它的设计初衷,和你预期的“返回毫秒”完全不是一回事,咱们分开说:
1. 为什么TimerObservable(0, 1)不返回毫秒值?
TimerObservable的两个参数定义是这样的:
- 第一个参数:首次发出值的延迟时间(单位:毫秒)
- 第二个参数:后续每次发出值的间隔时间(单位:毫秒)
但它发出的内容并不是时间戳,而是从0开始的递增数字:第一次发出0(延迟0ms后),第二次发出1(间隔1ms后),第三次发出2,以此类推。它的作用是帮你创建一个按固定间隔发出序号的流,而不是提供时间相关的数值。
2. 为什么执行代码后返回的数值“更慢”?
你看到的“更慢”其实有两个原因:
- 浏览器/JS引擎的定时器精度限制:即使你设置了1ms的间隔,JavaScript的事件循环机制决定了最小可实现的定时器间隔大约是4ms(不同环境可能略有差异)。也就是说,实际触发订阅回调的间隔会比你设置的1ms要长,所以你感觉“慢”。
- 输出的是序号而非时间差:你打印的
t是递增的整数,比如第N次触发就是N-1,这个数字本身和时间流逝的毫秒数没有直接关系——哪怕实际间隔是10ms,它还是会按0、1、2...的顺序输出,所以你会觉得它和“毫秒值”的增长速度不符。
正确获取毫秒值的做法
如果你的需求是获取当前时间戳或者流逝的毫秒数,需要自己结合时间工具来实现,比如:
方式1:记录初始时间,计算流逝毫秒数
const startTime = Date.now(); TimerObservable.create(0, 1).subscribe(t => { const elapsedMs = Date.now() - startTime; console.log('已流逝毫秒数:', elapsedMs); });
方式2:直接映射为当前时间戳
TimerObservable.create(0, 1) .pipe(map(() => Date.now())) .subscribe(currentMs => { console.log('当前时间戳(毫秒):', currentMs); });
补充:RxJS 6+的替代方案
注意:TimerObservable在RxJS 6及以上版本已经被废弃,推荐使用更简洁的timer函数,用法完全一致:
import { timer } from 'rxjs'; import { map } from 'rxjs/operators'; const startTime = Date.now(); timer(0, 1).subscribe(() => { console.log('已流逝毫秒数:', Date.now() - startTime); });
内容的提问来源于stack exchange,提问作者Swarovski
相关产品推荐
相关产品推荐

