Skip to content

retry

在异步函数失败时重试

535 bytes
since v12.1.0

使用方法

retry 函数运行异步函数,如果失败则重试。您可以指定重试次数、重试间隔时间以及是否使用指数退避。

选项

  • times 是最大重试次数(默认:3
  • delay 是重试间隔的毫秒数
  • backoff 是用于计算重试间隔的函数
    • 它接收尝试次数(从1开始)并返回以毫秒为单位的延迟时间。
  • signal(v12.3.0+)允许您传递 AbortController.signal 来中断重试操作
import * as _ from "radashi";
const api = {
users: {
async list() {
if (Math.random() < 0.5) {
throw new Error("Random error");
}
return [];
},
},
};
await _.retry({}, api.users.list); // 失败前尝试3次
await _.retry({ times: 10 }, api.users.list); // 失败前尝试10次
await _.retry({ times: 2, delay: 1000 }, api.users.list); // 尝试2次,间隔1秒
// 指数退避
await _.retry({ backoff: (i) => 10 ** i }, api.users.list); // 尝试3次,延迟分别为10、100、1000毫秒

中断

如果传递了 signal,重试操作可以被中断。当信号被中止时,retry 的 promise 将以 DOMException(即使在 Node.js 中)拒绝,消息为 This operation was aborted,名称为 AbortError

import * as _ from "radashi";
const abortController = new AbortController();
const signal = abortController.signal;
const promise = _.retry({ times: 3, delay: 1000, signal }, api.users.list);
// 立即停止重试:
abortController.abort();
try {
await promise;
} catch (err) {
if (err.message === "This operation was aborted") {
console.log("重试操作被中止");
}
}