我具有这个异步功能,可以在某些情况下重试Promise。
async function retry(f, interval = 1000, retries = 10) {
try {
return await f
} catch (e) {
if (retries == 0) {
throw e
}
setTimeout(() => {
retry(f, Math.min(60000, interval * 2), retries - 1);
}, interval);
}
}
我想用玩笑来断言在函数被抛出之前递归执行的次数。这是函数调用。
const f = new Promise((resolve, reject) => reject('test'))
retry(f)
答案 0 :(得分:2)
f
应该是重试时可以调用的函数。 Promise
只会解析/拒绝一次,然后保持该状态。使用功能可以让您重做想要尝试的事情。
当f
是一个函数时,它本身可以是一个闭包,计算其被调用的次数。例如:
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
async function retry(f, interval = 100, retries = 10) {
try {
return await f();
} catch (e) {
if (retries == 0) {
throw e;
}
await delay(interval);
return retry(f, Math.min(60000, interval * 2), retries - 1);
}
}
describe("retry", () => {
it("retries 10 times", async () => {
let count = 0;
const f = () => {
count++;
return Promise.reject(`test ${count}`);
};
try {
await retry(f);
} catch (e) {
// expect the last exception to be thrown
expect(e).toEqual("test 11");
}
// 10 retries + first try = 11
expect(count).toBe(11);
});
});