如何定义供web-sys get_current_position使用的js_sys::Function回调?
解决方案
你的理解是正确的,web_sys::Geolocation::get_current_position 要求传入JS侧的js_sys::Function类型参数,不能直接传入Rust原生闭包。你不需要用new_with_args构造函数,直接用wasm-bindgen提供的Closure工具即可完成Rust闭包到JS函数的转换。
首先导入需要的依赖:
use wasm_bindgen::{prelude::*, JsCast}; use web_sys::GeolocationPosition;
调整后的代码如下:
let navigator = web_sys::window().expect("Missing window").navigator(); let geolocation = navigator.geolocation().unwrap(); // 用Closure::wrap包裹Rust闭包,转换为JS可识别的函数对象 let success_callback = Closure::wrap(Box::new(|pos: JsValue| { // 可将传入的JsValue转换为强类型的GeolocationPosition使用 let position = pos.unchecked_into::<GeolocationPosition>(); let latitude = position.coords().latitude(); let longitude = position.coords().longitude(); // 此处填写你的业务逻辑 web_sys::console::log_1(&format!("获取到定位:纬度{},经度{}", latitude, longitude).into()); }) as Box<dyn FnMut(JsValue)>); // 传入回调参数,as_ref()将Closure转换为JsValue后再转为&js_sys::Function geolocation .get_current_position(success_callback.as_ref().unchecked_ref()) .expect("调用定位接口失败"); // 注意:如果回调只会执行一次,可调用forget()将闭包的生命周期交给JS侧管理,避免Rust侧自动drop后JS调用空指针 // 如果后续需要取消回调、重复使用该函数,需要将success_callback存储在全局变量或结构体中持有所有权 success_callback.forget();
如果需要添加错误处理回调,按照同样的方法构造第二个Closure传入get_current_position_with_error_callback方法即可。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

