首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型不匹配解决<impl::resolving::Future std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue,wasm_bindgen::JsValue>

类型不匹配解决<impl::resolving::Future std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue,wasm_bindgen::JsValue>
EN

Stack Overflow用户
提问于 2021-03-03 15:49:23
回答 1查看 467关注 0票数 0

我正在尝试使用带有异步调用的wasm_bindgen实现一个API类。

代码语言:javascript
复制
#![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

我还发现,应该在future_to_promisehttps://github.com/rustwasm/wasm-bindgen/issues/1858的帮助下实现结构方法的异步调用。

因此,问题在于_request_json**. 返回的类型。我猜错了。**

当我编译这个项目时,我得到了一个错误:

代码语言:javascript
复制
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正确的返回表达式是什么使代码工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-03 16:21:28

这一建筑:

代码语言:javascript
复制
async move {
    _request_json(&url, "GET")
}

具有impl Future<Output = impl Future<Output = Result<JsValue, JsValue>>>类型。

你可以这样解决它:

代码语言:javascript
复制
future_to_promise(async move {
    _request_json(&url, "GET").await
})

也可能是这样的:

代码语言:javascript
复制
future_to_promise(_request_json(&url, "GET"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66460420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档