javascript - 使用 `jest.useFakeTimers()` 时,为什么 `setImmediate` 不会无限期超时?
问题描述
使用时jest.useFakeTimers()
,为什么做setTimeout()
和setImmediate()
行为不同?:
beforeAll(jest.useFakeTimers);
afterAll(jest.useRealTimers);
describe("timer behavior", () => {
it('times out waiting for a setTimeout', async () => {
await new Promise(setTimeout);
});
it('successfully resolves a setImmediate', async () => {
await new Promise(setImmediate);
});
});
这种setTimeout()
行为对我来说是有意义的,但为什么一个嘲笑的setImmediate()
解决方案像往常一样?
解决方案
setImmediate 和 setTimeout 之间的区别在于 set setImmediate 会在“当前轮询阶段完成后”安排立即执行的回调,而 setTimeout 会安排在“经过 ms 的最小阈值之后”执行回调。
即使超时为 0,setTimeout 仍然依赖于检查时间的流逝,而 setImmediate 无论如何都不依赖于时钟。
因此,使用假计时器时,使用 setTimeout 安排的回调将始终等到模拟时钟滴答声,而使用 setImmediate 安排的回调将立即执行。
如果您查看 Jest 的源代码,它用于 setImmediate 的伪代码只是一个薄包装器,它创建一个可取消的回调并立即调用真正的 setImmediate。
推荐阅读
- regex - 正则表达式:从匹配的模式中排除字符串
- java - Spring Boot Data JPA 从存储过程接收多个输出参数
- ios - 无法调用非函数类型“对象”的值
- nginx - 无法禁用 X-frame 选项:nginx 中的同源
- angular - 我有一个输入,它使用其他输入字段的值自动填充其数据,但我不想自动填充它
- excel - 为 Jira 和 Excel 文件错误消息编写的 Visual Basic 应用程序
- java - 我应该使用 try/catch 来检查丢失的输入吗?
- docusignapi - Java JWT Docusign API - 重定向
- docker - Docker 桌面在 Windows 10 上崩溃
- tensorflow - 如何创建具有多个张量输入的可编译 tf.keras 模型?