简介
prmq 是一个方便前端开发者在项目中使用消息队列功能的 npm 包。它基于 pubsub-js 开发而成,增加了消息可靠性保证,支持在一个浏览器窗口或者同域名下多个窗口之间共享消息,以及消息处理函数的自动化注销等功能。
安装
该包可以使用 npm 安装:
npm install prmq
使用方法
首先引入 prmq:
import prmq from 'prmq';
订阅和发布消息
使用 prmq 的最基本功能是订阅和发布消息。订阅消息可以有不同的主题,一个主题可以有多个消息订阅者,当有消息发布时,所有订阅了该主题的消息处理函数将会被调用。
prmq.subscribe('news', (data) => { console.log('收到一条新闻:', data); }); prmq.publish('news', '这是一条新闻');
执行上面的代码,可以看到控制台输出了 '收到一条新闻:这是一条新闻'
。
取消订阅消息
当一个组件销毁时,需要取消它对消息的订阅。prmq 提供了自动注销订阅的功能,只需要在订阅消息时将返回的订阅记录保存下来,在组件销毁时调用保存下来的注销函数即可取消订阅。
const subscription = prmq.subscribe('news', (data) => { console.log('收到一条新闻:', data); }); // 稍后在合适的时候取消订阅 subscription.unsubscribe();
单个对象多个订阅者
在一个场景中,一个对象可能会被多个组件所订阅,使用普通的订阅方式需要为每个组件单独进行订阅注册。而 prmq 提供了 subscribeObj
方法,可以自动为一个对象的多个属性注册消息订阅。
-- -------------------- ---- ------- ----- --------- - ------------- - ---------- - --- - ------------- - ---------------------- --------------------- -------- - --- ------ - ------ ----------- - - ----- --------- - --- ------------ ---------------------------- ------- ------ -- - ---------------------- ------ --- ----------------------------
执行上面的代码,可以看到控制台输出了 '新的消息列表:[ '这是一条新闻' ]'
。
进阶功能
除了基本的订阅和发布消息外,prmq 还提供了进阶的功能,包括消息可靠性保证、多窗口共享消息等。
消息可靠性保证
在消息发布时,prmq 默认是不会对该消息进行缓存或重复发送的,这在某些场景下可能会导致系统不稳定。因此 prmq 提供了消息保障的功能,可以确保收到的消息列表完整无误。
使用消息保障的方法是,在发布消息时传入第三个参数,它是一个用来基于消息内容生成 hash 值的函数。prmq 会根据生成的 hash 值来判断该消息是否已经收到,并作出相应的处理。
prmq.subscribe('news', (data) => { console.log('收到一条新闻:', data); }); prmq.publish('news', '这是一条新闻', JSON.stringify, 3000); prmq.publish('news', '这是另一条新闻', JSON.stringify, 3000);
上面的代码中,第二次发布的消息是一条已经发布过的消息,但由于传入了 hash 函数,prmq 在 3 秒钟内只会输出一次 '收到一条新闻:这是一条新闻'
,而不会输出 '收到一条新闻:这是另一条新闻'
。
多窗口共享消息
在某些场景下,一个站点可能会有多个窗口打开同一个页面,这时需要在这些窗口之间共享消息。在使用 prmq 的场景中,一个窗口的环境和上下文信息与另一个窗口有区别,因此要实现多窗口共享消息,需要引入一个消息传递中心,即一个代理页面,所有窗口向它进行消息发布和订阅。
具体的使用流程示例:
在代理页面中进行消息中转:
-- -------------------- ---- ------- ------ ---- ---- ------- --------------- -------------- - ----------------------- --------- ---------- --- -- --------- - ----------------------------- -- ---
在项目的各个窗口中订阅和发布消息:
import prmq from 'prmq'; prmq.subscribe('news', (data) => { console.log('收到一条新闻:', data); }); prmq.publish('news', '这是一条新闻');
需要注意的是,多窗口共享消息时依赖于代理页面,代理页面打开和关闭会影响所有窗口的消息传播,因此在使用时需注意处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005694981e8991b448e4c95