1

我收到错误:

expected enum `std::result::Result<_, wasm_bindgen::JsValue>`
         found enum `std::result::Result<_, serde_wasm_bindgen::error::Error>`

当我通过实现 Serialize 来序列化一个结构然后将其传递给 时serde_wasm_bindgen,它使用此处
的示例代码 是最小可重现代码:

use wasm_bindgen::prelude::*;
use serde::ser::{Serialize, SerializeStruct, Serializer};

struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}
impl Serialize for Person {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut s = serializer.serialize_struct("Person", 3)?;
        s.serialize_field("name", &self.name)?;
        s.serialize_field("age", &self.age)?;
        s.serialize_field("phones", &self.phones)?;
        s.end()
    }
}

#[wasm_bindgen]
pub fn pass_value_to_js() -> Result<JsValue, JsValue> {
    let p = Person {
        name: String::from("Hello"),
        age: 56,
        phones: vec![String::from("phone")],
    };
    serde_wasm_bindgen::to_value(p) // error here
}

货运.toml

serde-wasm-bindgen = "0.1.3"
serde = "1.0.114"
4

2 回答 2

2

我按照这个问题解决了这个问题。

#[wasm_bindgen]
pub fn pass_value_to_js() -> Result<JsValue, JsValue> {
    serde_wasm_bindgen::to_value(&value).map_err(|err| err.into())
}
于 2020-06-28T20:02:53.280 回答
0

我对这些包一无所知,但是查看to_value 这里的代码,结果似乎与Result<JsValue, JsValue>.


// The Error in scope here is serde_wasm_bindgen::error::Error
type Result<T> = std::result::Result<T, Error>;

...SNIP...

/// Converts a Rust value into a [`JsValue`].
pub fn to_value<T: serde::ser::Serialize>(value: &T) -> Result<JsValue> {
    value.serialize(&Serializer::new())
}

所以看起来你返回这个值的函数必须改变才能与这个新Result类型兼容。

我猜你指的是这里README 中的示例。我经常发现 github README 中的代码示例不正确或已过时。不幸的是,我无法在该存储库中找到to_value()不立即使用unwrap()它的示例或测试。

于 2020-06-25T19:16:11.830 回答