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

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

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

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

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

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

相关搜索:使用Indy时连接不会超时超时-使用jest.useFakeTimers(‘现代’)和jest.setSystemTime()时未调用异步回调当使用usingServer时,Selenium webdriver超时不会设置为什么此when客户端post代码在没有网络连接时不会超时?为什么TypeScript在使用as类型时不会发出错误?在Java 7中使用方法重载时,为什么autoboxing不会覆盖varargs?为什么我的v-if在Vue中使用情态动词时不会触发?为什么在此react代码中释放外部div时,mouseup事件不会触发(使用window.addEventListener)为什么使用useRef钩子定义的计数器在每次渲染时都不会递增?为什么我的文本视图在设置文本时不会创建换行符,即使使用\n也是如此?当Pcap文件太大时,在c#中通过cmd使用TShark不会终止。为什么会这样呢?在Eclipse中使用Mylyn时,为什么任务上下文元素不会显示在导航器视图中?为什么我的注释标注不会出现?仅当使用自定义图像作为图钉时,标注才有效在片段中使用图像时,图像会显示在某些页面上,但不会显示在其他页面上。为什么?在我的Todo ReactApp中,我使用了flux。使用useEffect时,我添加了一个侦听器,但是当Todostore更新时,页面不会重新呈现。为什么不行?为什么在使用Knex.js/Objection时,我的所有数据都默认为空?我根本不会通过useNullAsDefault为什么在使用angular中的route.navigate进行路由时,父组件中注入的服务不会传递给子组件为什么在使用List迭代器的next方法时会出现不兼容的类型错误,而在使用List的get方法时却不会呢?当我在计时器中使用xlApp.CutCopyMode时,我的应用程序不会关闭。这一切为什么要发生?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用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.8K60

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

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

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

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

    10.3K20

    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.4K20

    从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.2K50

    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 任务也是类似的。

    81630

    深度理解NodeJS事件循环

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

    97300

    Nodejs高并发的原理

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

    96450

    在nodejs中事件循环分析

    但是不包括close事件,定时器和setImmediate()的回调。 idle, prepare: 这个阶段仅在内部使用,可以不必理会。...值得注意的是,poll阶段在执行poll queue中的回调实际上不会无限的执行下去。...与执行poll queue中的任务不同的是,这个操作在队列清空前是不会停止的。这也就意味着,错误的使用process.nextTick()方法会导致node进入一个死循环……直到内存泄漏。...注意这个第一间执行,这意味着,受到操作系统和当前执行任务的诸多影响,该回调并不会在我们预期的时间间隔后精准的执行。执行的时间存在一定的延迟和误差,这是不可避免的。...node的开发者们也清楚这两个方法的命名上存在一定的混淆,他们表示不会把这两个方法的名字调换过来---因为有大量的node程序使用着这两个方法,调换命名所带来的好处与它的影响相比不值一提。

    4K00

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

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

    66140
    领券