首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用`jest.useFakeTimers()`时,为什么`setImmediate`不会无限期超时?

使用jest.useFakeTimers()时,setImmediate不会无限期超时的原因是因为jest.useFakeTimers()会替换掉原生的定时器函数,包括setTimeoutsetIntervalsetImmediate。在使用jest.useFakeTimers()后,所有的定时器函数都会被模拟实现,而不是真正的等待一段时间后执行。

在模拟的定时器中,setImmediate会被立即执行,而不需要等待真正的时间间隔。这是因为setImmediate是一个异步函数,它会在当前事件循环的末尾被调用,而不会像setTimeout一样需要等待一段时间。

当使用jest.useFakeTimers()时,所有的定时器都会被立即执行,包括setImmediate。因此,setImmediate不会无限期超时,而是会立即执行。

需要注意的是,jest.useFakeTimers()只是在测试环境中模拟定时器行为,以便更好地控制测试的执行顺序和时间。在实际的生产环境中,定时器函数的行为仍然是按照原生的方式执行的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Jest测试包含setTimeout调用的函数踩坑记录

Fake timer 这样修改之后测试用例虽然可以通过了,但如果将上面的3s改成6s,我们就会遇到超时错误: [image-20210823195537643.png] 这是因为Jest每个测试用例默认只给了...通过jest.useFakeTimers()即可对当前文件启用fake timer。当然你也可以在单个测试用例前后调用useFakeTimers和useRealTimers来在两个模式之间切换。...在启用fake timer的时候,setTimeout、setInterval都会使用Jest提供的假实现,他们不会真正阻塞住测试用例。...于是,我们将测试用例稍作修改: jest.useFakeTimers(); test('enqueueJob should retry 6s after failing to run the job'...注意,这里我们不再使用await delay(0),而是改用了setImmediate,这是因为我们把setTimeout给mock了,所以不好使了,改用setImmediate的目的和原来是一样的。

6.6K60

带你详细了解 Node.js 中的事件循环

idle, prepare idle, prepare 阶段是给系统内部使用,idle 这个名字很迷惑,尽管叫空闲,但是在每次的事件循环中都会被调用,当它们处于活动状态。这一块的资料介绍也不是很多。...阻塞 I/O 超时时间 在阻塞 I/O 之前,要计算它应该阻塞多长时间,参考 Libuv 文档上的一些描述,以下这些是它计算超时时间的规则: 如果循环使用 UV_RUN_NOWAIT 标志运行、超时为...当事件循环开始先进入 timer 阶段,发现没有超时的定时器函数,继续向下执行。...虽然是递归的,但它不会影响事件循环调度,setTimeout 在下一次事件循环中被执行。...在 Node.js 的文档中也建议开发者尽可能的使用 setImmediate(),也更容易理解。

2.1K30

Jest单元测试之旅—实践总结

大部分单测的代码量都大于了实现,那为什么我们还要鼓励写单测呢?...resolves/rejects:Jest会等待异步函数执行完毕该方法应该和async/await配合使用 手动调用done:在我们没有调用done之前,当前测试不会结束,直至调用done方法,有点类似回调...这是因为Jest默认的超时时间为5秒,但是我们在进行测试不会真的等那么久,这时候Jest就提供了一系列工具方法解决该问题。...为什么我们需要进行Mock数据呢? 第一:在有些情况下我们没办法在测试环境中使用一些API或全局的方法,此时Jest提供的Mock方法是解决问题该重要手段。...Jest接管require系统,jest.mock告诉Jest,它在需要应返回模块模拟,而不是实际模块。这意味着模块模拟不会包装原始模块,它会完全替换require系统中的原始模块。

10.2K20

Node中的事件循环和异步API

如果遇到需要复杂的业务计算,应当想办法启用独立进程或交给其他服务进行处理。...idle, prepare: 仅内部使用。 poll: 获取新的I/O事件;node会在适当条件下阻塞在这里。 check: 执行setImmediate()设定的回调。...如果没有到1ms,那么在timers阶段的时候,超时时间没到,setTimeout回调不执行,事件循环来到了poll阶段,这个时候队列为空,此时有代码被setImmediate(),于是先执行了setImmediate...setImmediate,于是事件循环先进入check阶段执行回调,之后在下一个事件循环再在timers阶段中执行setTimeout回调,虽然这个setTimeout已经到了超时时间。...,且因为动用了红黑树,所以消耗资源大; setImmediate(),消耗的资源小,也不会造成阻塞,但效率也是最低的。

1.6K30

JS 事件循环 Node 篇

poll 阶段 poll 阶段主要有2个功能: 处理 poll 队列的事件 当有已超时的 timer,执行它的回调函数 even loop 将同步执行 poll 队列里的回调,直到队列为空或执行的回调达到系统上限...阶段,并执行check阶段的任务队列 若没有预设的setImmediate(),event loop将阻塞在该阶段等待,等待新的事件出现,这也是该阶段为什么会被命名为 poll(轮询) 的原因。...当 event loop 到达某个阶段,将执行该阶段的任务队列,直到队列清空或执行的回调达到系统上限后,才会转入下一个阶段。...此外,当有递归的异步操作只能使用setlmmediate,不能使用process.nextTick,前面已经展示过了递归调用nextTick会出现的错误,下面使用setlmmediate来试试看: function...这是因为setImmediate不会生成call stack。

2.2K10

从一个超时程序的设计聊聊定时器的方方面面

JS定时器共有三种:间隔定时器、超时定时器、立即定时器。后两者分别由setTimeout、setImmediate产生,这两个函数稍后再讲。...下面的代码为什么在小游戏中不能运行? setTimeout("alert('5 秒!')"...在定时器代码中,每次都检查一下当前时间与超时时间。这样无论定时器如何偏差,时间总不会错。 使用时间计算超时,这种方案适用于对时间要求不是特别精准的场景。...5,setTimeout(fn, 0) 因为setImmediate未被广泛实现,所以这种方法在单次延时执行的场景中便成了最佳选择。通过将超时时间设置为0,fn将在下一代循环中被执行。...换言之,如果间隔时间较长,使用setInterval基本没有问题;如果间隔时间较短,且上下可能存在数据依赖或资源竞争,当使用setTimeout。 下面的代码为什么在小游戏中不能运行?

1.3K20

从echarts-for-react源码中学习如何写单元测试

/src/utils'; // 把遇到的计时器挂起,在必要,再使用jest.runOnlyPendingTimers执行掉已经挂起的计时器 jest.useFakeTimers(); // 描述块,将多个...() 作用: 把遇到的计时器挂起,在必要,再使用jest.runOnlyPendingTimers执行掉已经挂起的计时器 这里使用jest.useFakeTimers()的目的就是暂停正在执行的timer...,但它们的值是一样的,也是可以的 小结 对于有返回值的function,就是通过判断「返回值」,是否与「期望值」相等即可 这样的好处: ① 当有新需求要扩展该函数,可以保证该函数的返回值仍保持不变,进而不会影响到使用到该函数的旧需求...② 当测试的函数比较复杂,非常方便,不用了解内部的详细代码,只需返回值符合期望即可 如何测试ReactComponent 当我写完一个React组件,我该如何测试它呢?...> { // mount()借助jsdom模拟浏览器环境,并提供DOM api和生命周期的支持,方便测试HOC(高阶组件) // shallow()浅渲染,将组件渲染成虚拟DOM对象,不会渲染内部子组件

6.1K50

Node.js 的微任务处理(基于Node.js V17)

而有些生产者会 hold 住事件循环从而让整个系统不会退出,比如我们启动了一个 TCP 服务器。事件循环处理了 Node.js 中大部分的执行流程,但是并不是全部。...这里以定时器为例,Node.js 在底层使用了一个 Libuv 的定时器节点管理 JS 层的所有定时器,并在 JS 层里维护了所有的定时器节点,然后把 Libuv 定时节点的超时时间设置为 JS 层最快到期的节点的时间...就是当有定时器超时,Libuv 从 C、C++ 回调 JS 层,JS 层会直接处理所有的超时节点后再回到 C++ 层,这时候才有机会处理微任务。...Node.js 在 JS 层维护了一个树,每个节点管理一个列表,处理超时事件,就会遍历这棵树的每个节点,然后再遍历这个节点对应队列里的每个节点。...而上面的代码就是保证在每次调用完一个 setTimeout 回调,都会处理一次微任务。同样 setImmediate 任务也是类似的。

77130

Java线程状态(生命周期)以及线程状态转换详解

官方为什么不将这两种状态分开呢?...无限期等待(WAITING):处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式地唤醒。...在A线程中调用了B线程的join()方法,表示只有当B线程执行完毕,A线程才能继续执行。如果有多个线程,除了A线程之外的其他线程正常竞争cpu和锁。   ...过期的suspend和resume方法    suspend方法被不推荐使用。不推荐使用suspend()去挂起线程的原因,是因为suspend()在导致线程暂停的同时,并不会去释放任何锁资源。...yield方法不会释放持有已获得的锁,只是释放cpu的执行权。  线程的cpu时间片使用完毕还未执行完任务,重回就绪态,但此时不会释放锁。

58540

Nodejs高并发的原理

当其中一个操作完成,内核会告诉Node.js,以便Node.js可以将相应的回调添加到轮询队列中以最终执行。...例如,如果TCP套接字在尝试连接收到 ECONNREFUSED,则某些* nix系统希望等待报告错误。...setImmediate() 实际上是一个特殊的timer,跑在event loop中一个独立的阶段。它使用libuv的API来设定在 poll 阶段结束后立即执行回调。...产生了一个事件进入到poll阶段的事件队列,此时事件队列准备执行callback,所以会打印(read time: 9),人工阻塞了5s,虽然此时timer定时器事件已经被添加,但是因为这一阶段的事件循环为完成,所以不会被执行...导致I/O处理完成或者定时任务超时后仍然无法执行, 导致了其它事件处理程序处于饥饿状态.

93550

深度理解NodeJS事件循环

当其中一个操作完成,内核会告诉Node.js,以便Node.js可以将相应的回调添加到轮询队列中以最终执行。...例如,如果TCP套接字在尝试连接收到 ECONNREFUSED,则某些* nix系统希望等待报告错误。...setImmediate() 实际上是一个特殊的timer,跑在event loop中一个独立的阶段。它使用libuv的API来设定在 poll 阶段结束后立即执行回调。...产生了一个事件进入到poll阶段的事件队列,此时事件队列准备执行callback,所以会打印(read time: 9),人工阻塞了5s,虽然此时timer定时器事件已经被添加,但是因为这一阶段的事件循环为完成,所以不会被执行...导致I/O处理完成或者定时任务超时后仍然无法执行, 导致了其它事件处理程序处于饥饿状态.

94700

Node 事件循环知多少

多进程带来的好处是明显的,比如你可以听歌的同时,打开编辑器敲代码,编辑器和听歌软件的进程之间丝毫不会相互干扰。... check 阶段执行回调 如果没有 setImmediate 回调需要执行,会等待回调被加入到队列中并立即执行回调,这里同样会有个超时时间设置防止一直等待下去 当然设定了 timer 的话且 poll... 队列为空,则会判断是否有 timer 超时,如果有的话会回到 timer 阶段执行回调。...假设 poll 被堵塞,那么即使 timer 已经到时间了也只能等着,这也是为什么上面说定时器指定的时间并不是准确的时间。...setImmediate 设计在 poll 阶段完成执行,即 check 阶段 setTimeout 设计在 poll 阶段为空闲时,且设定时间到达后执行,但它在 timer 阶段执行 来看一个具体的示例

58610
领券