You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:33:47