gpt4 book ai didi

rust - 类型不匹配解决 ::Output == std::result::Result

转载 作者:行者123 更新时间:2023-12-03 11:43:49 28 4
gpt4 key购买 nike

我正在尝试使用 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 调用取出到一个单独的私有(private)函数 _request_json以避免不同 API 方法中的代码重复(它们应该是多个,而不仅仅是 getVersion)。
我从这里获取了 HTTP 调用的基本示例: https://rustwasm.github.io/wasm-bindgen/examples/fetch.html
我还发现结构方法的异步调用应该在 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 的正确返回表达式是什么?使代码有效?

最佳答案

这种结构:

async move {
_request_json(&url, "GET")
}
类型为 impl Future<Output = impl Future<Output = Result<JsValue, JsValue>>> .
你可以像这样修复它:
future_to_promise(async move {
_request_json(&url, "GET").await
})
可能也像这样:
future_to_promise(_request_json(&url, "GET"))

关于rust - 类型不匹配解决 <impl std::future::Future as std::future::Future>::Output == std::result::Result<wasm_bindgen::JsValue, wasm_bindgen::JsValue>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66460420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com