# pubsub **Repository Path**: justfn/pubsub ## Basic Information - **Project Name**: pubsub - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-23 - **Last Updated**: 2021-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

发布订阅 publish & subscribe

## 特点 * 轻量, 无依赖 * 自由灵活, channel key 可为(除函数和NaN外的)任意JS变量 (推荐使用引用类型,避免重复) * ES6+ # 安装&引入 ```javascript // $ npm i -S @justfn/pubsub // 引入pubsub功能库 import PubSub from '@justfn/pubsub'; ``` ### 基本使用 ```javascript // 定义一个频道, 作为媒介 const myChannel = 'my-tv'; // 定义需要执行的某些操作 let myAction = (channel, ...messages)=>{ // console.log(channel, ...messages); }; // 订阅频道, 接收到消息后执行响应 let token = PubSub.sub(myChannel, myAction); // 向指定频道发送消息 PubSub.pub(myChannel, 'hello', 'word', '!'); // 异步发送 PubSub.pubAsync(myChannel, 'hello', 'word', 'async'); ``` ### 取消订阅 ```javascript const myChannel01 = 'channel01'; const myChannel02 = 'channel02'; let myAction01 = (channel, ...msgs)=>{ console.log('action01', channel, ...msgs); }; let myAction02 = (channel, ...msgs)=>{ console.log('action02', channel, ...msgs); }; let token01 = PubSub.sub(myChannel01, myAction01); let token02 = PubSub.sub(myChannel01, myAction02); let token03 = PubSub.sub(myChannel02, myAction01); let token04 = PubSub.sub(myChannel02, myAction02); // 取消指定的订阅 PubSub.clearSubs(token01); // 取消指定频道的所有订阅 PubSub.clearSubs(myChannel01); // 取消指定动作的所有订阅 PubSub.clearSubs(myAction02); PubSub.pub(myChannel01, '01') PubSub.pub(myChannel02, '02') ``` ### 获取订阅的动作 ```javascript // 获取指定频道的所有action, 返回一个 action 组成的数组 PubSub.getActions(myChannel); ``` ### 统一错误处理 ```javascript PubSub.onError(myChannel, (errEvt)=>{ const { channel, msgs, action, err, } = errEvt; console.log(errEvt); }) ``` ### 多频道处理 ```javascript // 订阅发布的 channel, 可为一数组(由多个channel组成的数组 ), // 表示同时订阅/发布多个 channel const myChannel01 = 'c01'; const myChannel02 = 'c02'; const myChannel03 = 'c03'; const myChannel04 = 'c04'; const myAction = (channel, ...msgs)=>{ // 注意: 此时 channel 为 发布的channel值 console.log(channel, ...msgs); } PubSub.sub([myChannel01, myChannel02, myChannel04], myAction); PubSub.pub([ myChannel02, myChannel03, myChannel04 ], '同时发布到3个频道'); PubSub.pub([ myChannel01 ], {key: '只发布到一个频道'}); ``` ### 立即执行的订阅 ```javascript // 当发布早于订阅先执行时, 订阅的动作将执行不了, 此时可使用立即执行一次的订阅来解决 const myChannel = Symbol('0'); const myAction = (channel, ...msgs)=>{ console.log(channel, ...msgs); } PubSub.pub(myChannel, '早于订阅前已发布的消息 001 '); PubSub.pub(myChannel, '早于订阅前已发布的消息 002 '); PubSub.sub(myChannel, myAction, true); // 此处仍能收到前面最后一次的发布消息 ``` ### 频道使用引用类型, 防止重复定义使用 ```javascript // 定义两个channel const myChannel01 = {}; const myChannel02 = {}; // 因为channel为引用类型, 两个channel是不同的 const token01 = PubSub.sub(myChannel01, (channel, ...msgs)=>{ console.log( channel===myChannel01, channel===myChannel02 ); console.log(channel, ...msgs); }) const token02 = PubSub.sub(myChannel02, (channel, ...msgs)=>{ console.log( channel===myChannel01, channel===myChannel02 ); console.log(channel, ...msgs); }) PubSub.pub(myChannel01); PubSub.pub(myChannel02); ``` ### 便捷使用方式 ```javascript const myChannel = Symbol('my-channel'); const myAction = (channel, ...msgs)=>{ console.log(channel, ...msgs); } const myChannelHandler = PubSub.use(myChannel); // 相当于 PubSub.sub(myChannel, myAction); myChannelHandler.sub(myAction); // 相当于 PubSub.pub(myChannel, 'jello', 'word'); myChannelHandler.pub('hello', 'word'); // 相当于 PubSub.pubAsync(myChannel, 'jello', 'word'); myChannelHandler.pubAsync('hello', 'word'); // 相当于 PubSub.getActions(myChannel); myChannelHandler.getActions(); // 相当于 PubSub.clearSubs(myChannel); myChannelHandler.clearSubs(); // 相当于 PubSub.onError(myChannel, errEvt=>console.log(errEvt)); myChannelHandler.onError(errEvt=>console.log(errEvt)); ``` ### 顶级channel, 表示任意channel ```javascript // AnyChannel 一个特殊定义的频道,用来表示任意channel import PubSub, { AnyChannel, } from '@justfn/pubsub'; const myChannel01 = Symbol('01'); const myChannel02 = Symbol('02'); const myAction01 = (channel, ...msgs)=>{ console.log('action01', channel, ...msgs); } const myAction02 = (channel, ...msgs)=>{ console.log('action02', channel, ...msgs); } PubSub.sub(AnyChannel, myAction01); // 所有的发布都将被订阅到 PubSub.sub(myChannel01, myAction01); PubSub.sub(myChannel01, myAction02); PubSub.sub([ myChannel02 ], myAction01); PubSub.pub(myChannel01, 'pub01'); PubSub.pub(myChannel02, 'pub02'); PubSub.pub(AnyChannel, 'pub-all'); // 所有的频道都将接收到订阅 ``` ## License MIT ## More ... 给我留言吧...