类型化事件
本例在异步命令执行期间发送进度通知,展示前端如何通过事件订阅观察后端工作,以及进度事件与最终命令响应的区别。
40_event_broadcast · 关键文件:main.mbt, app.html
行为
启动计数器后产生 tick 事件和 done 事件,命令还会返回汇总结果。run_id 用于区分不同运行。
实现说明
以下为入口中的节选,完整上下文见本页源码链接。
async fn run_ticker(
context : @proton.CommandContext,
payload : StartPayload,
) -> TickerResult {
let count = clamp(payload.count, 1, 20)
let interval_ms = clamp(payload.interval_ms, 100, 2000)
let ticks : Array[TickEvent] = []
for index in 1..<=count {
@async.sleep(interval_ms)
let tick = TickEvent::{
run_id: payload.run_id,
index,
total: count,
remaining: count - index,
}
ticks.push(tick)
context.emit(tick_event, tick)
}
let done = DoneEvent::{ run_id: payload.run_id, total: count, }
context.emit(done_event, done)
TickerResult::{ ticks, done, }
}
类型化扩展把 start 绑定到 run_ticker。处理器在 tick 之间异步等待,发送 tick/done 通知,最后返回 TickerResult。进度事件与命令结果职责不同,显示一次 tick 不代表命令已经完成。
次数与间隔由后端限制。UI 应使用请求标识区分重叠任务,随所属对象关闭订阅,并处理请求取消。目录虽叫 broadcast,这不是持久广播日志。
运行
完成源码检出与运行时安装后,在仓库根目录执行:
moon -C examples run 40_event_broadcast --target native
限制与使用边界
事件与命令响应职责不同。启动运行前注册监听器;事件不是持久历史记录或确认消息。