教程十 在Go中使用Energy创建跨平台GUI应用 - 事件通信(IPC) 之 Go定义事件JS调用

news2024/11/30 10:39:26

介绍

Energy Go和JS的事件通信, Go监听事件JS触发。

IPC事件还有其它的几种使用方式,在其它教程中更新

在正常前后端大多数开发场景,JS和Go前后端数据交互都需要Http接口方式交互。

Energy中可以不使用Http,使用事件通信机制(IPC,事件通信可以让Go和JS很方便的进行数据交互和功能实现,在Go中或JS定义事件监听,然后在Go中和JS中触发监听的事件。

定义的方式为

Go: 监听事件 event.On

JS : 触发事件 ipc.emit

使用

Go监听事件

在main函数中

回调函数中监听事件 ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn)

监听事件 event.On("事件名", func(context ipc.IIPCContext))

context

获取触发的browserId(浏览器ID),channelId(通道ID),获取参数和返回参数

Connect() net.Conn         //IPC 链接
EventId() int32            //IPC 事件ID
ChannelId() int64          //render channel channelId
BrowserId() int32          //render channel browserId
Message() *IPCEventMessage //接收的消息数据 一搬配合Response函数
Response(data []byte)      //通过响应应达的方式返回结果,在data符合[argumentList]规范可使用Arguments() 一搬配合Message函数
Free()                     //释放内存
Arguments() IArgumentList  //用于 ipc 进程之间通信, 带有参数类型
Result() *IPCContextResult //用于 render(js)进程触发 browser(go)进程监听返回值, 带有固定几个参数类型

常用的  

ChannelId() int64

BrowserId() int32

Arguments() IArgumentList

Result() *IPCContextResult

其它的根据场景而定

Js触发事件

ipc.emit("事件名", [传递参数], [callback])

emit参数

  • 参数一,必选: 事件名

  • 参数二,可选: 传递参数,数组类型, 示例: ["传递的参数1", "传递的参数2", 666, 888.99, false, true]

  • 参数三,可选: 回调函数,带有一个返回参数

function writeMessage(data) {
    let message = document.getElementById("message");
    message.innerHTML = message.innerHTML + data + "<br>"
}
ipc.emit('go-on-event-demo-return', ['传递的数据', 99999, false, 9999.999], function (data) {
    writeMessage("data-length: " + data.length)
    writeMessage("data: " + data)
})

完整示例 

Go

package main

import (
	"bytes"
	"embed"
	"fmt"
	"github.com/energye/energy/cef"
	"github.com/energye/energy/common/assetserve"
	"github.com/energye/energy/ipc"
	"strings"
)

//go:embed resources
var resources embed.FS

func main() {
	//全局初始化 每个应用都必须调用的
	cef.GlobalCEFInit(nil, &resources)
	//创建应用
	cefApp := cef.NewApplication(nil)
	//指定一个URL地址,或本地html文件目录
	cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/go-to-js.html"
	cef.BrowserWindow.Config.Title = "Energy - go on event - js emit event"
	cef.BrowserWindow.Config.Icon = "resources/icon.ico"

	ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
		//在go中监听一个事件
		event.On("go-on-event-demo", func(context ipc.IIPCContext) {
			fmt.Println("go-on-event-demo event run")
			//js 中传递的数据
			//虽然 Arguments 结构支持多个数据类型,但在js和go的对应中,只保留了 string, integer, double, boolean 的对应关系,其它类型在 go 和 js数据传递时不支持
			arguments := context.Arguments()
			fmt.Println("参数个数:", arguments.Size())
			//参数是以js调用时传递的参数下标位置开始计算,从0开始表示第1个参数
			p1 := arguments.GetString(0)
			fmt.Println("参数1:", p1)
		})
		//带有返回值的事件
		event.On("go-on-event-demo-return", func(context ipc.IIPCContext) {
			fmt.Println("go-on-event-demo-return event run")
			//js 中传递的数据
			//虽然 Arguments 结构支持多个数据类型,但在js和go的对应中,只保留了 string, integer, double, boolean 的对应关系,其它类型在 go 和 js数据传递时不支持
			arguments := context.Arguments()
			fmt.Println("参数个数:", arguments.Size())
			//参数是以js调用时传递的参数下标位置开始计算,从0开始表示第1个参数
			p1 := arguments.GetString(0)
			p2 := arguments.GetInt32(1)
			p3 := arguments.GetBool(2)
			p4 := arguments.GetFloat64(3)
			fmt.Println("\t参数1-length:", len(p1))
			//fmt.Println("\t参数1:", p1)
			fmt.Println("\t参数2:", p2)
			fmt.Println("\t参数3:", p3)
			fmt.Println("\t参数4:", p4)
			//返回给JS数据, 通过 context.Result()
			var buf = bytes.Buffer{}
			for i := 0; i < 100000; i++ {
				buf.WriteString(fmt.Sprintf("[%d]-", i))
			}
			var data = "这是在GO中监听事件返回给JS的数据:" + buf.String()
			fmt.Println("返回给JS数据 - length:", strings.Count(data, "")-1)
			context.Result().SetString(data)
		})
	})

	//内置http服务链接安全配置
	cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022
		server.AssetsFSName = "resources" //必须设置目录名
		server.Assets = &resources
		go server.StartHttpServer()
	})
	//运行应用
	cef.Run(cefApp)
}

JS

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>go-to-js</title>
    <script type="application/javascript">
        function clearMessage() {
            document.getElementById("message").innerHTML = "";
        }

        function writeMessage(data) {
            let message = document.getElementById("message");
            message.innerHTML = message.innerHTML + data + "<br>"
        }

        //ipc.emit函数有3个参数
        //参数1 事件名        必填    string类型
        //参数2 参数          非必填  array类型,传递到Go中的数据,
        //                          参数只保留了 string, integer, double, boolean 的对应关系,其它类型在 go和 js数据传递时不支持
        //                          参数是以js调用时传递的参数下标位置开始计算,从0开始表示第1个参数
        //参数3 回调函数      非必填   function类型, go返回的结果

        //调用Go中监听的事件
        function goOnEventDemo() {
            clearMessage()
            //参数传递,从下标0开始表示第1个参数
            ipc.emit('go-on-event-demo', ['传递的数据'])
        }

        //带有返回值的事件
        function goOnEventDemoReturn() {
            clearMessage()
            //参数传递,从下标0开始表示第1个参数
            var strData = ""
            for (var i = 0; i < 100000; i++) {
                strData += "[" + i + "]";
            }
            ipc.emit('go-on-event-demo-return', ['传递的数据:' + strData, 99999, false, 9999.999], function (data) {
                writeMessage("data-length: " + data.length)
                writeMessage("data: " + data)
            })
        }
    </script>
</head>
<body style="margin: 0px;padding: 0px;">
Go中监听事件,JS中调用<br>
<button onclick="goOnEventDemo()">go-on-event-demo</button>
<button onclick="goOnEventDemoReturn()">go-on-event-demo-return</button>
<div id="message"></div>
</body>
</html>

效果图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ProGuard插件对Spring Boot程序进行代码混淆

使用ProGuard插件对Spring Boot程序进行代码混淆 介绍&#xff1a; ​ ProGuard是一个开源的Java类文件&#xff08;只能处理Java代码&#xff0c;但是对应资源文件等是不能起作用的&#xff09;的压缩器、优化器、混淆器和预校验器。其处理的过程主要分为以下几个步骤&#…

系统移植总结

1&#xff1a;什么是系统移植 1&#xff09;系统移植是给开发板搭建一个Linux操作系统 2&#xff09;从官方获取源码&#xff0c;进行配置和编译&#xff0c;生成板子需要的镜像 2&#xff1a;安装tftp服务器的作用 Tftp服务器&#xff1a;是基于UDP协议完成简单的文件传输 作…

mysql sql优化(索引优化)经验漫谈

文章目录1. 当用sql查找是否“存在”场景2. where 条件 in的限制3. updade语句要不要考虑索引的命中情况4. mysql 预编译 多线程5. 函数与索引失效的关系6. mysql隐性类型转换与索引失效的关系7. 联合索引8. 联合索引最左匹配原则9. 回表 索引覆盖 聚簇索引 非聚簇索引10. 前缀…

这下真的是阳了个阳!

实际情况 很不幸&#xff0c;在前天&#xff0c;出现了新冠阳性的症状&#xff0c;随后用抗原检测了下&#xff0c;有阳的条带出现&#xff08;很浅&#xff0c;弱阳&#xff0c;因为才出现症状&#xff09;&#xff0c;基本上就是确定阳了。 抗原检测不知道今天是第几天了&…

第40篇 网络(十)WebKit初识

导语 WebKit是一个开源的浏览器引擎。Qt中提供了基于WebKit的QtWebKit模块&#xff0c;它包含了一组相关的类。QtWebKit提供了一个Web浏览器引擎&#xff0c;使用它便可以很容易的将万维网&#xff08;WorldWide Web&#xff09;中的内容嵌入到Qt应用程序中。与此同时&#xf…

大二Web课程设计——基于HTML+CSS+JavaScript+jquery手表商城购物网站(17页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

无人机集群的分布式协作 VI-SLAM

以下内容来自从零开始机器人SLAM知识星球 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# D2SLAM: Decentralized and Distributed Collaborative Visual-inertial SLAM System for Aerial Swarm 论文地址&#xff1a;https://arxiv.org/abs/2211.01538…

视频怎么转文字?快把这些方法收好

如今短视频让知识传播变得越来越简单&#xff0c;我们可以很轻松的就通过短视频了解到大量的知识要点。但是当我们想要回温知识点的时候&#xff0c;需要重新观看视频&#xff0c;这就有些不太便利。其实我们可以通过将视频转成文字&#xff0c;这样子就容易归纳知识点了。那你…

Jlink commander使用方法(附指令大全)

Jlinkcmd它可以方便用户在非仿真的情况下&#xff0c;hold内核、单步、全速、设置断点、查看内核和外设寄存器、读取flash代码等等&#xff0c;方便大家拥有最高的权限查看在运行中的MCU情况&#xff0c;查找非IDE仿真情况下&#xff0c;MCU运行异常的原因。 目录 驱动安装 …

粉笔科技张小龙:能传授知识文化和技能,就是对社会的贡献和交代

粉笔科技张小龙在一次粉笔科技的管培生大会上强调&#xff0c;今天是互联网时代&#xff0c;你只有为别人提供价值&#xff0c;提供更高品质的价值&#xff0c;以及更高效率的提供价值&#xff0c;你才有价值。一个企业是这样&#xff0c;一个人也是这样。#张小龙# 你把事情做到…

微服务框架 SpringCloud微服务架构 分布式缓存 42 Redis 主从 42.4 数据同步原理【优化】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式缓存 文章目录微服务框架分布式缓存42 Redis 主从42.4 数据同步原理【优化】42.4.1 主从同步的问题优化42.4.2 总结42 Redis 主从 42…

QA | SWCF2022 笔记:C波段卫星与5G之间的干扰排查及解决方案

2022年度SWCF卫星通信与仿真测试研讨会正在进行中。昨日精彩演讲&#xff1a;C波段卫星与5G之间的干扰排查及解决方案&#xff0c;昨晚收到一些粉丝的技术问题&#xff0c;我们汇总了热点问题并请讲师详细解答。 演讲主题&#xff1a;C波段卫星与5G之间的干扰排查及解决方案 干…

龙芯内核的UOS安装 Mariadb-server

1.安装 Mariadb-server 1.1安装配置 sudo apt install mariadb-server启动数据库 systemctl start mariadb;设置数据库自启动 systemctl enable mariadb;对数据库进行一些设置 mysql_secure_installation输入当前密码&#xff08;因为是第一次安装&#xff0c;没有密码&am…

基于Android的应用市场软件的设计

基于Android的应用市场软件的设计 摘  要 随着智能手机的普及&#xff0c;人们越来越依赖手机进行一系列操作。 由于Android系统是一款免费的操作系统&#xff0c;导致了使用Android系统的手机占到7成左右。为了让Android手机用户体验更好&#xff0c;就需要让Android手机用…

【linux】之私有云OpenStack手动分布式部署

一、环境准备 参考: https://docs.openstack.org/zh_CN/install-guide/ 1, 静态IP(NetworkManager服务可以关闭) 2,主机名与绑定 192.168.122.11 controller 192.168.122.12 compute 192.168.122.13 cinder3, 关闭防火墙和selinux 4, 时间同步 所有节点准备yum源 # yum …

12.6、后渗透测试--Windows系统下信息收集模块

一、存活主机发现 步骤1、使用arp查看缓冲表&#xff1a;meterpreter > arp步骤2、局域网内存活主机发现&#xff1a;meterpreter > run post/windows/gather/arp_scanner RHOSTS172.16.0.0/24二、应用程序枚举 方法1&#xff1a; 获取靶机上的软件安装信息meterpreter…

免费刷题的软件测试面试题库小程序,萌新必备

现如今&#xff0c;不仅学习卷、考证卷&#xff0c;就连找工作也开始卷得没边了。就如最近几年新崛起的软件测试岗位&#xff0c;很多人为了能过快速通过面试&#xff0c;或者拿到offer&#xff0c;纷纷在面试前几周左右&#xff0c;不惜花重金&#xff0c;购买面试题目&#x…

【总结】有三AI所有原创GAN相关的学习资料汇总(2022年12月)

GAN的研究和应用在这几年发展可以说是非常迅猛&#xff0c;无疑是这几年深度学习计算机视觉领域里落地性最酷的技术之一&#xff0c;包括图像与视频生成&#xff0c;数据仿真与增强&#xff0c;各种各样的图像风格化任务&#xff0c;人脸与人体图像编辑&#xff0c;图像质量提升…

高分子PEGDBCO-PEG-Acrylates,DBCO-PEG-ACRL,二苯并环辛炔PEG丙烯酸酯

●外观以及性质&#xff1a; DBCO-PEG-ACRL产物呈固体或粘性液体&#xff0c;取决于PEG分子量“点击化学"一般由叠氮化物&#xff08;azide&#xff09;和炔烃&#xff08;alkyne&#xff09;作用形共价键&#xff0c;具有高效稳定&#xff0c;高特异性等优点。反应不受PH…

【Vue 快速入门系列】Vue中如何使用动画与过渡

文章目录前言一、回忆css3中的动画二、Vue中单标签使用动画1.默认使用方法2.自定义使用方法三、Vue中多标签实现动画效果四、使用第三方动画前言 本篇博客将会介绍如何在Vue中使用动画效果。 一、回忆css3中的动画 定义一个动画&#xff1a; 定义一个动画名为atguigu keyfr…