0

Warp 有这样的范式,

let hi = warp::path("hello")
    .and(warp::path::param())
    .and(warp::header("user-agent"))
    .map(|param: String, agent: String| {
        format!("Hello {}, whose agent is {}", param, agent)
    });

这些过滤器.map()允许您使用提取的值(来自先前过滤器的输出)调用闭包。

如果在上面的示例中我想做这样的事情,我该如何在这个范式中操作,

.map(async |param: String, agent: String| {
    foo(&param).await?;
    format!("Hello {}, whose agent is {}", &param, agent)
});

当我在过滤器的闭包中使用异步函数时,出现.map此错误,

错误[E0708]:当前不支持带参数的async非闭包move

无论如何要warp与已经异步的库兼容?

4

1 回答 1

2

您可以使用and_then

.and_then(|param: String, agent: String| async move {
    foo(&param).await?;
    Ok(format!("Hello {}, whose agent is {}", &param, agent))
});

请注意,这实际上不是一个async闭包,它是一个常规闭包,它返回一个由async块创建的未来。有关更多信息,请参阅之间的区别。|_| async move {}async move |_| {}

于 2021-05-06T04:18:44.607 回答