javascript - 在WASM-Bindgen Rust中创建带有鼠标输入事件关闭事件的回调时发生关闭事件调用错误

标签 javascript rust webassembly onmousemove wasm-bindgen

我有一个从WASM-Bindgen "canvas" example派生的Rust程序。我试图在onmousemove元素的每个JavaScript Canvas事件上调用一些Rust代码。我的代码当前成功创建了DOM事件(看起来如此)。但是,在触发的每个事件上,Firefox开发人员版开发人员工具的控制台都会显示错误:Uncaught Error: closure invoked recursively or destroyed already这是我的代码的一部分:

use std::f64;
use std::sync;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;

mod canvas_manager;
use canvas_manager::CanvasManager;

#[wasm_bindgen(start)]
pub fn start() {
    let document = web_sys::window().unwrap().document().unwrap();
    let canvas = document.get_element_by_id("canvas").unwrap();
    let canvas: web_sys::HtmlCanvasElement = canvas
        .dyn_into::<web_sys::HtmlCanvasElement>()
        .map_err(|_| ())
        .unwrap();

    let manager = CanvasManager::new(canvas, 480, 480);

    manager.fill_rect_with_color(210, 12, 60, 6, "#444");
    
    manager.fill_rect_with_color(210, 462, 60, 6, "#444");
    
    manager.fill_rect_with_color(236, 236, 8, 8, "#999");

    manager.clear_canvas();

    let xPos= sync::Arc::from(sync::Mutex::new(Box::new(0f64)));

    let xPosCloned = xPos.clone();

    let a = Closure::wrap(Box::new(move || {
        let mut xPosBox = xPosCloned.lock().unwrap();
        **xPosBox += 1f64;
        //web_sys::console::log_1(&JsValue::from_f64(2.5f64));
    }) as Box<dyn FnMut()>);

    manager.canvas.set_onmousemove(Some(a.as_ref().unchecked_ref()));
}

最佳答案

在提供的代码中,a将在start()的末尾删除。
您可以通过a.forget()修复该问题,但随后会引入内存泄漏。

let a = Closure::wrap(Box::new(move || {
    let mut xPosBox = xPosCloned.lock().unwrap();
    **xPosBox += 1f64;
    //web_sys::console::log_1(&JsValue::from_f64(2.5f64));
}) as Box<dyn FnMut()>);

manager.canvas.set_onmousemove(Some(a.as_ref().unchecked_ref()));
a.forget();
请看看好的answer如何避免内存泄漏。

关于javascript - 在WASM-Bindgen Rust中创建带有鼠标输入事件关闭事件的回调时发生关闭事件调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63640557/

相关文章:

javascript - 在输入组中带有下拉菜单的响应式 Bootstrap 按钮

rust - 如何使用 'static lifetime for a struct with lifetime ' a 实现特征?

rust - 如何创建自可变引用的 Rc<RefCell<>> ?

typescript - 如何将 WebAssembly 函数导入 TypeScript?

javascript - 正则表达式替换引号和小于、大于符号

javascript - 使用 jQuery 验证 keyup 上的表单输入

javascript - 在 Apigee 中存储 Assets

rust - 为什么 Diesel 结构中的可选字段未实现特征

webassembly - 无法使用 Emscripten 绑定(bind) C++ 类

webassembly - Blazor 中有没有办法将 wasm-function(#) 映射回 c# 方法?