【问题标题】:Rust: how to use await in function chainRust:如何在函数链中使用 await
【发布时间】:2020-07-29 23:59:42
【问题描述】:

所需代码: 注释掉的块编译和工作,但是我想从嵌套匹配样式转移到更清晰的函数链

async fn ws_req_resp(msg: String, conn: PgConn) -> Result<String, Box<dyn std::error::Error>>{
    let req: WSReq = serde_json::from_str(&msg)?;

    match req.request_type{
        "upsert_competitions" => {
            // let dr = serde_json::from_value(req.data);
            // match dr{
            //     Ok(d) => match upsert_competitions(conn, d).await{
            //         Ok(x) => serde_json::to_string(&x).map_err(|e| e.into()),
            //         Err(e) => Err(Box::new(e))
            //         }
            //     Err(e) => Err(Box::new(e))
            // }
            serde_json::from_value(req.data).and_then(|d| async move {
                upsert_competitions(conn, d).await}).and_then(|r| serde_json::to_string(&r))
                .map_err(|e| e.into())
        },
        uwotm8 => {
            Err(Box::new(InvalidRequestError{req_type: uwotm8.to_string()}))
        }
    }
}

upsert_competitions签名pub async fn upsert_competitions(conn: PgConn, new: Vec&lt;ApiNewCompetition&gt;) -&gt; Result&lt;Vec&lt;DbCompetition&gt;, diesel::result::Error&gt;

错误:

expected enum `std::result::Result<_, serde_json::error::Error>`
           found opaque type `impl core::future::future::Future`

已尝试将 await 放在链中的多个位置,但没有编译。 相信等待未来应该等待它完成,然后返回结果。

(对我来说,从这个函数返回一个未来可能会更好;然后在外面打开。但是我不明白为什么链中的await 失败了,所以很明显我缺乏理解......也在尝试为了返回一个未来,我遇到了编译器不知道返回大小的问题)

完整代码 https://github.com/open-fantasy-sports/fantasy-sport-api-rust/blob/ef9db156efa8dbc159eae1c80fb7ac0a6a3ddee3/result_server/src/main.rs#L63

【问题讨论】:

    标签: rust async-await


    【解决方案1】:

    有人告诉我不能在这样的函数链中使用 await。

    当我切换到返回 Box&lt;dyn std::error::Error + Sync + Send + 'static&gt; 错误类型时。 然后我能够再次成功地使用? 运算符作为中心代码 (以前认为由于错误返回类型不明确而失败)。

    因此,即使不更改函数,也可以使用这种语法使代码变得美观且可读。

    更新代码:

    pub async fn upsert_competitions(req: WSReq, conn: PgConn, ws_conns: &mut WSConnections_, user_ws_id: Uuid) -> Result<String, BoxError>{
        let deserialized: Vec<NewCompetition> = serde_json::from_value(req.data)?;
        let competitions_out= db::upsert_competitions(&conn, deserialized.into_iter().map(transform_from).collect_vec())?;
        if let Some(ws_user) = ws_conns.lock().await.get_mut(&user_ws_id){
            sub_to_competitions(ws_user, competitions_out.iter().map(|c| &c.competition_id)).await;
        }
        publish_competitions(ws_conns, &competitions_out).await;
        let resp_msg = WSMsgOut::resp(req.message_id, req.method, competitions_out);
        serde_json::to_string(&resp_msg).map_err(|e| e.into())
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 1970-01-01
      • 2023-02-06
      • 2022-01-27
      • 2020-08-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多