DeepSeek Harness 前沿工程实践
张嘉熙
PayPal 高级软件工程师
885 人已学习
新⼈⾸单¥59
DeepSeek Harness 前沿工程实践
15
15
1.0x
00:00/00:00
登录|注册

03|事件系统:五种分发模式及其适用场景

你好,我是张嘉熙。
前两讲我们打通了时间(可撤销 Effect)和空间(响应式依赖)两个维度。这一讲补上第三块拼图——通信。前面讲的依赖解决的是“要”(A 需要 B 的能力)的问题,但插件之间还有一种关系是“说”(A 要通知 B 发生了某件事)。比如用户发出一个事件,日志插件要记录、统计插件要计数——事件发出方和事件接收方没有直接依赖关系,只是这些插件都想“听到”这件事。
Cordis 中通信的核心在于它的事件系统,它把事件分发这件事,拆成了五种模式。
我们先看看 Cordis 中事件系统的基本使用方式:
// 来自官方 cordis-tutorial 第四章的 stats.ts(节选)
declare module '@deepseek-ai/cordis' {
interface Events {
'stats/report'(name: string, count: number): void // 声明一个事件:名字 + 监听器签名*
}
}
export class StatsService extends Service {
bump(name: string) {
// ...*
this.ctx.emit('stats/report', name, next) // 发出事件,此处的next为当前count自增+1后的值*
}
}
// 来自官方 cordis-tutorial 第四章的 reporter.ts(节选)
export function apply(ctx: Context) {
ctx.on('stats/report', (name, count) => { // 监听事件
console.log(`[stats] ${name} -> ${count}`)
})
}
这里我们已经能看到事件系统的两个核心动作,以及一种似曾相识的声明方式:
emit(发出)和 on(监听):一方 emit('stats/report', ...) 发出,另一方 on('stats/report', ...) 监听。事件名用 namespace/action 的斜杠形式,因为所有事件共享一个扁平命名空间,斜杠前缀(stats/)能把相关事件分组。
declare module { interface Events } 这和上一讲的声明合并很类似——它把「事件名 + 监听器签名」写进声明,让 emit/on 都获得类型检查(写错编译期就报错)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《DeepSeek Harness 前沿工程实践》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部