javascript - 开玩笑断言承诺递归
问题描述
我有这个异步函数可以在某些条件下重试承诺。
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);
}
}
我想用 jest 断言递归执行的次数,直到函数被抛出。这是函数调用。
const f = new Promise((resolve, reject) => reject('test'))
retry(f)
解决方案
f
应该是重试时可以调用的函数。APromise
只会解决/拒绝一次,然后保持该状态。使用一个函数可以让你重做你想尝试的事情。
Whenf
是一个函数,它本身可以是一个闭包,计算它被调用的次数。例如:
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);
});
});
推荐阅读
- vue.js - Vue Route 4 在 Vue 3 中刷新浏览器时无法读取链接
- java - 无法通过 ssl 连接到 mqtt 代理
- java - 使用 localstack 设置服务端口
- angular - 如何正确声明具有来自控制台的值的变量?
- linux - 如何使用 OpenRC 创建/使用服务?
- javascript - iframe 谷歌登录 - 登录后刷新 iframe
- c# - EF Core Generic Repository 从新插入的通用实体异步获取 Id
- python - 根据pandas python中另一列的组从一个DataFrame列创建标签
- azure-devops - STDIN 在列出 Azure VM 时被列出,因此出现“资源 ID 无效”错误
- python - Matplotlib为什么颜色条y标签会随着多个颜色条消失