使用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()照常解析?

最佳答案

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

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

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

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

10-07 14:48