如何在开玩笑中超时承诺?

时间:2018-06-10 11:04:34

标签: asynchronous promise async-await timeout jestjs

所以我试图创建一个简单的超时承诺

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 个答案:

答案 0 :(得分:2)

目前还不可能。为了实现这一点,需要做两件事:

  • 从开玩笑方面 - 他们需要完成migrating to lolex,这是一个持续努力将他们的假计时器与Sinon的统一者
  • 从Node.js方面 - 我们需要implement hooks让你自己运行promise微任务队列。这是Node.js核心与V8团队上周会面的新工作。

由于这两个还不可能 - 目前你不可能做你想要的。我们正在研究这个问题。你必须使测试异步并且await承诺 - 它将花费15毫秒,并且没有什么可以做的。

这是因为promises总是延迟一个microtick - 我们在Node.js中将其编码为use case testing #1