WebAssemblyのTIPSです。JS関数のコールバックをRust側で処理する場合には、Rustのクロージャーを渡すのではなくJSのクロージャーに変換してから渡します。
ポイントは以下です。
- as_ref()でJsValueに変換
- unchecked_ref()でさらに&Functionに変換
- 最後にSomeでOption化
以下画像の読み込み完了(オンロード)が呼ばれる例です。set_onloadが求める型は、Option<&Js_sys::Function>です。Rustのクロージャーをそのまま使えないので、Closureを作成して変換していくわけです。
let image = web_sys::HtmlImageElement::new().unwrap();
let callback = Closure::once(move || {
//コールバックで実行したいこと
});
image.set_onload(Some(callback.as_ref().unchecked_ref()));