1.0.2 • Published 3 years ago

@justfn/pubsub v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

特点

  • 轻量, 无依赖
  • 自由灵活, channel key 可为(除函数和NaN外的)任意JS变量 (推荐使用引用类型,避免重复)
  • ES6+

安装

npm i -S @justfn/pubsub

举些栗子

// 引入pubsub功能库 
import PubSub from '@justfn/pubsub';

基本使用

// 定义一个频道, 作为媒介 
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');

取消订阅

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')

获取订阅的动作

// 获取指定频道的所有action, 返回一个 action 组成的数组  
PubSub.getActions(myChannel);

统一错误处理

PubSub.onError(myChannel, (errEvt)=>{
  const {
    channel,
    msgs,
    action,
    err,
  } = errEvt;
  console.log(errEvt);
})

多频道处理

// 订阅发布的 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: '只发布到一个频道'});

立即执行的订阅

// 当发布早于订阅先执行时, 订阅的动作将执行不了, 此时可使用立即执行一次的订阅来解决 

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); // 此处仍能收到前面最后一次的发布消息 

频道使用引用类型, 防止重复定义使用

// 定义两个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);

便捷使用方式

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

// 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 ...

给我留言吧...