When using `jest.useFakeTimers()`, why doesn't `setImmediate` time out indefinitely?

时间:2018-08-01 23:33:28

标签: javascript jestjs

When using jest.useFakeTimers(), why do setTimeout() and setImmediate() behave differently?:

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);
  });
});

The setTimeout() behavior makes sense to me, but why does a mocked setImmediate() resolve as usual?

1 个答案:

答案 0 :(得分:1)

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

即使超时为0,setTimeout仍然取决于检查时间的流逝,而setImmediate则不以任何方式取决于时钟。

因此,使用伪计时器时,使用setTimeout调度的回调将始终等待,直到模拟时钟滴答为止,而使用setImmediate调度的回调将立即执行。

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

相关问题