事件与回调

什么是事件与回调?

事件

  • 事件是程序中发生的某种动作或状态变化,例如用户点击按钮、键盘输入、定时器触发等。

  • 事件通常由外部操作(如用户交互)或系统内部状态变化触发。

回调

  • 回调是一种编程模式,用于在某个事件发生后执行特定的代码逻辑。

  • 回调通常存在与模块与组件中、通过接口、函数或方法实现,允许程序在特定条件下调用预先定义的操作。

事件与回调的作用

  1. 解耦:将事件触发逻辑与事件处理逻辑分离,提高代码的模块化和可维护性。

  2. 异步处理:在事件驱动的编程模型中,回调可以用于异步处理事件,避免阻塞主线程。

  3. 灵活性:通过回调机制,可以在运行时动态指定事件处理逻辑。

事件与回调的区别?

在轻语言中:

事件通常用于在开发实际应用程序时使用,一个事件只能处理一个动作。

回调通常用于在封装类库时、在类库、组件中向外部传递事件或同时处理多个动作的场景。

如何使用事件与回调?

1.使用事件

使用事件通常也被称为监听事件的发生,主要目的是监听用户对程序产生的动作,例如:在视窗与安卓程序中、当用户打开程序后、点击了程序窗口界面中的某个按钮,此时系统会通过事件的方式,向我们发送用户点击按钮的这个操作,那么我们如何在代码中去接收这个操作返回给我们的事件呢?

在轻语言中一共有 3 种方式接收系统反馈给我们开发者的事件:

方式一:接收事件语句

这种方式与函数类似;通过关键字 事件 定义;可在 IDE 设计窗口中双击组件或通过点击属性窗口的事件下拉列表,自动生成相关语句,语法为:

事件 对象名.事件名(参数列表)
    ' 处理收到事件的代码

结束 事件

示例:

事件 按钮1.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
    ' 当按钮1被单击时、通过调试输出窗口输出文本内容
    调试输出("按钮1被单击")
结束 事件

事件代码块适用于可视化窗口中的组件,以及窗口成员变量对象,不能用于局部变量对象。

方式二:子程序引用

当需要监听动态创建的组件的相关事件时;如果采用方式一就必须给每个组件的事件都单独声明一个接收事件的语句块,假设动态创建10个按钮,就需要添加 10 个事件代码语句块,显然这种方式会让代码变的很繁缛,而通过子程序引用的方式只需要使用一个函数接收反馈的事件即可。

视窗程序示例:

事件 按钮1.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
    ' 循环创建 10 个按钮
    变量循环(索引 = 0,10,1)
        变量 btn = 创建 按钮()
        btn.标题 = "按钮" + 索引
        ' 使用下方子程序接收当用户被单击时系统反馈的事件
        btn.置被单击回调(&动态创建的按钮被单击)
        垂直滚动框1.添加组件(btn)
    结束循环
结束 事件

' 该函数的名称可以自定义取名,但该函数的参数需与回调接口中的事件参数完全一致
函数 动态创建的按钮被单击(来源对象 为 对象,事件对象 为 鼠标事件)
    变量 被单击的按钮 = (按钮)来源对象
    调试输出("被单击按钮:" + 被单击的按钮.标题)
结束 函数

子程序引用方式适用于动态创建的组件、或局部定义的组件,使用“&”符号引用的子程序函数的参数类型和格式、可以在IDE支持库中查询指定组件接口中的事件、例如:上方我们给动态创建的按钮设置的被单击回调子程序函数、这个函数是我们自定义的、但是这个函数中具体的参数、可以在IDE支持库窗口中找到按钮组件、再找到按钮节点下的“被单击回调”接口、这个接口中事件的参数即是我们需要设置的参数。

方式三:拉姆达表达式

拉姆达表达式是一种编程语法糖,可以更简单、使用更少的代码接收事件。语法为:

(参数列表) -> { 函数体 }
  • 参数列表:方法的参数,可以省略参数类型(由编译器推断)、只需要设置参数名称即可。

  • ->:拉姆达表达式操作符,将参数列表和函数体分开。

  • 函数体:接收事件中具体的操作代码。

将上方,方式二中给动态创建的按钮设置被单击回调时;换成拉姆达的语法则为:

事件 按钮1.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
    ' 循环创建 10 个按钮
    变量循环(索引 = 0,10,1)
        变量 btn = 创建 按钮()
        btn.标题 = "按钮" + 索引
        ' 使用拉姆达表达式接收被单击事件,括号类只需设置参数名
        ' 注意:拉姆达表达式中的参数名称不能与上方事件参数名相同
        btn.置被单击回调((局_源对象,局_事件对象)->{
            变量 被单击的按钮 = (按钮)局_源对象
            调试输出("被单击按钮:" + 被单击的按钮.标题)
        })
        垂直滚动框1.添加组件(btn)
    结束循环
结束 事件

拉姆达表达式适用于局部对象组件,例如事件块、函数块中创建的对象。

2.使用回调

在轻语言中,回调是针对多个事件的统一处理方式,当我们在程序中请求获取服务器中的数据时,通常会有两种情况;请求成功、请求失败,而为了方便可以同时监听这两种情况的发生,则可以采用回调的方式来监听。

安卓程序示例:

' 声明异步网络操作对象
变量 异步网络操作1 为 异步网络操作

事件 窗口创建完毕()
    ' 创建对象实例
    异步网络操作1 = 创建 异步网络操作()
结束 事件

事件 按钮1.被单击(来源对象 为 视图)
    异步网络操作1.发送GET请求("get1","http://www.vcnstudio.com/","UTF-8",异步操作回调)
结束 事件

定义 异步操作回调 为 异步网络操作.请求完毕回调
    事件 请求发送成功(标记 为 文本型,响应头 为 哈希表,返回数据 为 字节型[])
        变量 结果 = 字节集到文本(返回数据,"UTF-8")
        标签1.标题 = "请求标记:" + 标记 + " 请求发送成功;返回数据为:\n" + 结果
    结束 事件

    事件 请求发送失败(标记 为 文本型,响应头 为 哈希表,返回数据 为 字节型[],错误信息 为 文本型)
        标签1.标题 = "请求标记:" + 标记 + " 请求发送失败;错误信息:"  + 错误信息
    结束 事件
结束 定义

定义事件

事件的定义一般多用于在组件或模块的封装中,例如自定义一个模块或一个组件时,想通过像普通组件那样事先事件回调,定于语法为:

公开 事件 事件名称(参数列表)

示例:

公开 事件 搜索被触发(关键字 为 文本型)

自定义事件与使用在线视频教程: 自定义事件与模块回调