在導出的 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 閉包的參數數量。