【问题标题】:When using `jest.useFakeTimers()`, why doesn't `setImmediate` time out indefinitely?使用 `jest.useFakeTimers()` 时,为什么 `setImmediate` 不会无限期超时?
【发布时间】:2018-08-01 23:33:27
【问题描述】:

在使用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() 会像往常一样解决?

【问题讨论】:

    标签: javascript jestjs


    【解决方案1】:

    The difference between setImmediate and setTimeout 是 set setImmediate 在“当前轮询阶段完成后”安排立即执行的回调,而 setTimeout 安排在“经过毫秒的最小阈值之后”执行的回调。

    即使超时时间为 0,setTimeout 仍然依赖于检查时间的流逝,而 setImmediate 则完全不依赖于时钟。

    因此,使用假计时器时,使用 setTimeout 安排的回调将始终等到模拟时钟滴答声,而使用 setImmediate 安排的回调将立即执行。

    如果您查看 Jest 的源代码,它用于 setImmediate 的伪代码只是一个薄包装器,它创建一个可取消的回调和immediately calls the real setImmediate

    【讨论】:

    • 这样说是有道理的。感谢您的详细解释!
    • 很高兴,很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2022-07-23
    相关资源
    最近更新 更多