【问题标题】:type mismatch resolving <impl std::future::Future as std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue, wasm_bindgen::JsValue>类型不匹配解决 <impl std::future::Future as std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue, wasm_bindgen::JsValue>
【发布时间】:2021-06-02 05:42:30
【问题描述】:

我正在尝试使用 wasm_bindgen 和异步调用来实现 API 类。

#![allow(non_snake_case)]

use std::future::Future;

use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::JsFuture;
use js_sys::Promise;
use web_sys::{Request, RequestInit, RequestMode, Response};
use wasm_bindgen_futures::future_to_promise;

use crate::fetch_example::*;


#[wasm_bindgen]
#[derive(Debug, Serialize, Deserialize)]
pub struct API {
    root: String,
}


#[wasm_bindgen]
impl API {
    pub fn new(root: &str) -> Self {
        Self {
            root: root.to_string(),
        }
    }

    pub fn getVersion(&self) -> Promise {
        let url = format!("{}/version", self.root);

        future_to_promise(async move {
            _request_json(&url, "GET")
        })
    }

    // other methods ...
}


// What is the correct returned type instead of Result<JsValue, JsValue> ???
async fn _request_json(url: &str, method: &str) -> Result<JsValue, JsValue> {
    let mut opts = RequestInit::new();
    opts.method(method);
    opts.mode(RequestMode::Cors);

    let request = Request::new_with_str_and_init(&url, &opts)?;

    request.headers().set("Accept", "application/json")?;

    let window = web_sys::window().unwrap();
    let resp_value = JsFuture::from(window.fetch_with_request(&request)).await?;

    let resp: Response = resp_value.dyn_into().unwrap();

    let json = JsFuture::from(resp.json()?).await?;

    Ok(json)
}

正如所见,我将 HTTP 调用取出到一个单独的私有函数 _request_json 中,以避免不同 API 方法中的代码重复(它们应该是多个,而不仅仅是 getVersion)。

我从这里获取了 HTTP 调用的基本示例:https://rustwasm.github.io/wasm-bindgen/examples/fetch.html

另外我发现struct方法的异步调用应该在future_to_promise的帮助下实现:https://github.com/rustwasm/wasm-bindgen/issues/1858

所以问题在于_request_json 返回的类型。我猜不准。

编译项目时出现错误:

type mismatch resolving `<impl std::future::Future as std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue, wasm_bindgen::JsValue>`

如果我将 _request_json 的正文复制到 future_to_promise 内,一切正常。

_request_json 使代码正常工作的正确返回表达式是什么?

【问题讨论】:

    标签: rust wasm-bindgen


    【解决方案1】:

    这个结构:

    async move {
        _request_json(&url, "GET")
    }
    

    类型为impl Future&lt;Output = impl Future&lt;Output = Result&lt;JsValue, JsValue&gt;&gt;&gt;

    你可以这样修复它:

    future_to_promise(async move {
        _request_json(&url, "GET").await
    })
    

    大概也是这样的:

    future_to_promise(_request_json(&url, "GET"))
    

    【讨论】:

    • 谢谢。你的解释很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多