代码之家  ›  专栏  ›  技术社区  ›  user2167582

如何在笑话中暂停承诺?

  •  2
  • user2167582  · 技术社区  · 6 年前

    所以我试着创造一个简单的超时承诺

    const delay = (time, value) => {
      return Promise.resolve(); //  THIS WORKS
    
      // NEED TO, but wont work
      return new Promise(function(resolve) {
        setTimeout(() => resolve(value), time);
      });
    };
    
    
    const request = (count) => {
      if (count === 15) return;
      return makeRequest().then(
        res => Promise.resolve() // if it works it works.
      ).catch(
        err => delay(1000).then(() => request(count - 1));
      )
    }
    
    describe("on fail", () => {
      beforeEach(() => jest.useFakeTimers());
      it("should retry 15 times", async () => {
    
        request();
        jest.runTimersToTime(15001); // alias `advanceTimersByTime`
        await expect(request.mock.calls.length).toBe(15); // what am i missing? or rather, what's jest missing?
      });
    });
    1 回复  |  直到 6 年前
        1
  •  2
  •   Benjamin Gruenbaum    6 年前

    现在是不可能的。要做到这一点,需要两件事:

    • 从玩笑的角度来说-他们需要完成 migrating to lolex 这是一个持续的努力,以统一他们的假计时器与信诺的
    • 在node.js端-我们需要 implement hooks 这让你自己运行promise微任务队列。这是node.js core和V8团队上周的一次会议上的新工作。

    因为这两个还不可能-现在不可能按你的要求去做。不过,我们正在努力。你必须使测试异步并且 await 承诺-将需要15毫秒,没有什么可以做的。

    这是因为承诺总是会延迟一个microtick——我们在node.js中将其编码为 use case testing #1 .