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

Go WebAssembly响应JavaScript事件及IndexedDB回调实现方法问询

实现方案

你要实现的JS代码中给request.onsuccess绑定回调的逻辑,在Go WASM环境下等价于用js.FuncOf创建回调函数,再赋值给request对象的对应属性即可,和你之前添加事件监听器的逻辑完全一致。

完整实现代码如下:

//go:build js && wasm
package main

import (
	"fmt"
	"syscall/js"
)

// 提前声明已打开的IndexedDB实例,类型为js.Value,需保证执行删除前db已初始化完成
var db js.Value

func removeEmployee() {
	// 等价JS: db.transaction(["employee"], "readwrite")
	tx := db.Call("transaction", js.ValueOf([]interface{}{"employee"}), "readwrite")
	// 等价JS: .objectStore("employee")
	store := tx.Call("objectStore", "employee")
	// 等价JS: .delete("00-03")
	request := store.Call("delete", "00-03")

	// 构建onsuccess回调
	var successCb js.Func
	successCb = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		// args[0]即为触发的success事件对象
		js.Global().Call("alert", "Kenny's entry has been removed from your database.")
		// 单次触发后释放回调资源,避免WASM内存泄漏
		successCb.Release()
		return nil
	})
	// 绑定回调到request的onsuccess属性
	request.Set("onsuccess", successCb)

	// 可选:新增错误回调处理异常
	var errCb js.Func
	errCb = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		event := args[0]
		fmt.Println("删除失败:", event.Get("target").Get("error").String())
		errCb.Release()
		return nil
	})
	request.Set("onerror", errCb)
}

func main() {
	// WASM常驻逻辑
	c := make(chan struct{}, 0)
	// 可选:将删除方法暴露给JS侧直接调用
	js.Global().Set("remove", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
		removeEmployee()
		return nil
	}))
	<-c
}

核心说明

  • JS中的链式API调用,在Go侧拆分为多次Call调用即可,每一步返回的都是对应JS对象的js.Value实例
  • 给异步API的事件属性(如onsuccess/onerror)绑定回调,和DOM事件监听逻辑一致,用js.FuncOf创建回调后通过Set方法绑定到对应属性即可
  • 不需要重复触发的回调执行完成后必须调用Release()释放资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者Hasan A Yousef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:07