You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust的retry crate中使用异步闭包?

解决retry crate 1.2.1中异步函数重试的问题

问题根源

你使用的是retry crate的同步retry函数,它要求传入的闭包直接返回OperationResult<T,E>(或可转换为它的Result<T,E>),但你传入的是异步闭包——异步闭包返回的是Future类型,和函数期望的返回值完全不匹配,这就是报错的核心原因。

解决方案

retry crate 1.2.1支持异步重试,但需要使用专门的异步API并启用对应特性:

  1. 修改Cargo.toml启用futures特性
retry = { version = "1.2.1", features = ["futures"] }
  1. 使用异步版的retry函数
    替换同步的retry为retry::future::retry,这个函数接受返回Future的闭包,会自动处理异步操作的重试逻辑。调整后的代码示例:
use retry::{future::retry, delay::Fixed};
use log::{info, debug};

// 必须在异步上下文内调用(比如async函数或异步main)
async fn process_message() {
    let my_message = ...; // 你的消息实例

    let final_result = retry(
        Fixed::from_millis(10000).take(3),
        || async {
            match handle_message(my_message.clone()).await {
                Ok(()) => {
                    info!("Message successfully registered");
                    Ok(()) // 返回Ok,停止重试
                }
                Err(e) => {
                    if e.is_code(EC::MyErrorCode, true) {
                        debug!("Handling message error- {:?}", e);
                        Err(format!("Dkg message w/ error: {:?}", e)) // 返回Err,触发重试
                    } else {
                        Ok(()) // 非目标错误,不重试,直接结束
                    }
                }
            }
        }
    ).await;

    // 处理最终结果
    match final_result {
        Ok(_) => info!("操作最终成功"),
        Err(err) => eprintln!("重试3次后仍失败: {}", err),
    }
}

关键说明

  • 异步版retry函数本身返回Future,必须用.await执行,因此调用它的代码必须处于异步上下文(比如async fn、tokio::main等)。
  • 重试逻辑:闭包返回Err时触发重试,返回Ok时立即停止重试。你可以根据错误类型决定是否返回Err来控制重试范围。

内容的提问来源于stack exchange,提问作者NewToCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:39:58