导入带有对象参数的 js 函数 - Rust / wasm_bindgen

Importing a js function with an object parameter - Rust / wasm_bindgen

我正在尝试在 wasm_bindgen 中使用 rust 中的 JS 函数,该函数有一个类似于 fetch:

等函数的对象参数
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen]
    fn fetch(resource: &str, config: &JsValue);
}

(仅以fetch为例,我知道有更好的方法使用fetch from rust...)

我不确定如何在 Rust 中为配置对象建模。

我尝试使用 JsValue,但似乎 JsValue 只能从原始类型创建,而不能从对象创建。

我在网上看到一些 serde 可以在这里提供帮助的建议,但我找不到任何具体示例,而且我自己尝试让它工作也没有成果。

提前感谢您对此的调查!

看起来您可以使用 js_sys::Reflect 来访问或设置任意值,或者您可以使用 serde 来获取 parse/unparse 值

对于第一种方法,此资源解释了如何在无类型对象上读取或写入 属性:https://rustwasm.github.io/docs/wasm-bindgen/reference/accessing-properties-of-untyped-js-values.html and an example of using this interface can be found in web-sys itself, which defines the RequestInit object which is used when building the config object for fetch(): https://docs.rs/web-sys/0.3.50/src/web_sys/features/gen_RequestInit.rs.html#4

另一种方式是使用serde。可以在 https://rustwasm.github.io/docs/wasm-bindgen/examples/fetch.html and a more detailed explanation can be found at https://rustwasm.github.io/docs/wasm-bindgen/reference/arbitrary-data-with-serde.html

找到这方面的示例

定义要序列化和反序列化的对象后,JsValue::from_serde().into_serde() 可用于与 JsValue

相互转换

同事指出的另一种选择是使用serde_wasm_bindgen,例如

#[derive(Serialize, Deserialize)]
struct FetchConfig {
    pub method: String,
}

fn call_fetch() {
    let config = FetchConfig {
        method: "post".to_string()
    };
    let config = serde_wasm_bindgen::to_value(&config).unwrap();
    fetch("https://example.com", &config);
}