You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义供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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:04