在导出的 Rust 函数中接收 JavaScript 闭包

您可以使用 js-sys crate 来访问 JavaScript 的 Function 类型,并通过 Function.prototype.applyFunction.prototype.call 调用该函数。

例如,我们可以将一个 Vec<u32> 包装在一个新的类型中,将其导出到 JavaScript,并对 Vec 的每个成员调用一个 JavaScript 闭包


# #![allow(unused_variables)]
#fn main() {
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub struct VecU32 {
    xs: Vec<u32>,
}

#[wasm_bindgen]
impl VecU32 {
    pub fn each(&self, f: &js_sys::Function) {
        let this = JsValue::null();
        for &x in &self.xs {
            let x = JsValue::from(x);
            let _ = f.call1(&this, &x);
        }
    }
}
#}

由于 Rust 没有函数重载,call# 方法还需要一个数字,表示传递给 JavaScript 闭包的参数数量。