rust 我可以在Rocket中使用async fn作为处理程序吗?

oknrviil  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(140)

我正在使用Rocket框架,我想在处理程序中发出一个异步HTTP请求,如下所示


# [get("/")]

async fn handler() -> String {
  some_func().await;
  "OK".into()
}

结果,我得到了下一个错误

the trait `rocket::response::Responder<'_>` is not implemented for `impl core::future::future::Future`

我尝试编写实现,但是失败了。有没有办法为impl Trait实现trait?
或者指定async fn的返回类型,这样我就可以返回实现了必要特性的自定义类型。

tv6aics1

tv6aics11#

在Rocket 0.5.0发布之前,你必须使用异步路由的开发版本。值得注意的是,这也意味着你可以使用稳定的Rust来编译。
在你的货物里

rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }

一旦使用开发版本,您就可以完全按照问题中的方式编写异步路由。
请注意,不同的API可能会有所不同。请参阅https://api.rocket.rs/master/rocket/index.html以取得开发版本的文件。

vaqhlq81

vaqhlq812#

从Rocket v0.4开始,仍然不可能使用异步函数描述处理程序,尽管Rocket计划在未来迁移到完全异步的环境中(参见问题#1065)。
在这个迁移完成之前,你不能有效地处理Rocket中的future。解决办法可能包括添加你自己的执行器,并在从处理程序中出现的future完成时阻塞(这肯定不会像你所能的那样从异步中受益)。

bq9c1y66

bq9c1y663#

截至2022年,这是直截了当的:
Rocket使得在路由中使用async/await变得很容易。

use rocket::tokio::time::{sleep, Duration};

# [get("/delay/<seconds>")]

async fn delay(seconds: u64) -> String {
    sleep(Duration::from_secs(seconds)).await;
    format!("Waited for {} seconds", seconds)
}

相关问题