所以我正在尝试创建一个简单的超时承诺
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?
});
});
目前是不可能的。为了实现这一点,需要做两件事:
- 从玩笑方面来看 - 他们需要完成迁移到 lolex,这是一项持续的努力,以将他们的假计时器与 Sinon 的
- 从 Node.js 方面来看 - 我们需要实现钩子,让你自己运行 promise 微任务队列。这确实是上周 Node.js 核心和 V8 团队会面的新工作。
由于这两个还不可能 - 目前不可能做到你所要求的。不过,我们正在研究这个问题。您必须使测试异步并await
承诺 - 这将需要 15 毫秒,并且对此无能为力。
这是因为承诺总是延迟微刻度 - 我们在 Node 中将其编码.js作为用例测试 #1。