mcpField
R
riverpod-retry

riverpod-retry

github.com/serverpod开发1076 次安装34 周前更新
代码仓库

关于 riverpod-retry

riverpod-retry 介绍 Riverpod 的 Provider 重试行为及自定义方式。开发者可按 Provider 或全局设置重试策略,并针对特定错误停止重试。

主要功能

  1. 01默认采用指数退避
  2. 02自定义重试函数
  3. 03按 Provider 设置策略
  4. 04全局设置重试策略
  5. 05返回 null 停止重试

适用场景

  1. 01在临时故障后重试 Provider
  2. 02为不同 Provider 设置独立策略
  3. 03通过 ProviderScope 应用统一策略
  4. 04对特定错误停止重试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/serverpod/skills-registry --skill riverpod-retry

安装后在 Claude Code 中输入/riverpod-retry确认已加载。

详细介绍

Riverpod — 自动重试

说明

当 provider 的计算抛出异常时,Riverpod 会重试该 provider。可以针对单个 provider 或全局自定义重试行为。

默认行为

默认情况下,provider 最多会重试指定次数(例如 10 次),并采用指数退避策略(例如从 200ms 增至 6.4s)。Error 和 ProviderException 不会触发重试:Error 表示存在 bug;ProviderException 表示某个依赖项失败,因此不会重试依赖它的 provider(而是重试底层的 provider)。

自定义重试函数

重试函数的签名为 Duration? Function(int retryCount, Object error)。返回一个 Duration,表示下次重试前的延迟;返回 null 则停止重试。

Duration? myRetry(int retryCount, Object error) {
  if (retryCount >= 5) return null;
  if (error is ProviderException) return null;
  return Duration(milliseconds: 200 * (1 << retryCount));
}
设置位置
  • 单个 provider: 定义 provider 时传入 retry: myRetry(或使用代码生成时传入 @Riverpod(retry: myRetry))。
  • 全局: 向 ProviderScope 或 ProviderContainer 传入 retry: myRetry。
// Global
ProviderScope(retry: myRetry, child: MyApp())

// Per provider (manual)
final myProvider = Provider<int>(retry: myRetry, (ref) => 0);
禁用重试

始终返回 null:

ProviderScope(retry: (retryCount, error) => null, child: MyApp())
等待带重试的异步 provider

ref.watch(myProvider.future)(或等效写法)会持续等待,直到所有重试均已耗尽或 provider 成功。因此,await ref.watch(myProvider.future) 会跳过中间的失败,并在 provider 最终成功或放弃时完成。

评论

支持 Markdown