文
章
目
录
章
目
录
大家知道如何使用Promise实现发布订阅模式吗?感觉挺有意思,就自己动手实践了一把,今天来给大伙分享分享。
一、啥是发布订阅模式?要解决啥问题?
发布订阅模式,简单来说,就是一种消息通信模式。在这个模式里,有生产者和消费者。生产者负责发布消息,消费者呢,负责接收并处理这些消息。打个比方,你在电商平台上关注了某个店铺(相当于订阅),店铺上新(发布消息)后,你就能收到通知(处理消息),这就是典型的发布订阅场景。咱们今天要用Promise来实现一个简单的发布订阅模式。
二、需求分析
这次的需求就是利用Promise里的resolve
方法和then
方法,打造一个简易的发布订阅者模式。具体拆分开来,就是把resolve
方法当成生产者发布消息的途径,把then
方法作为消费者接收和处理消息的方式。
三、实现思路详解
- 定义发布消息的函数:得写一个
produce
函数,这个函数基于resolve
方法,专门用来发布消息。 - 添加订阅者的函数:还需要一个
addConsumer
函数,用它来添加那些订阅消息的消费者。 - 消息处理机制:通过
then
方法来接收生产者发布的消息,并且执行相应的处理操作。
四、代码实现及解读
// 定义一个函数,用于创建发布订阅模式的实例
function ProducerConsumerPattern() {
// 用于存储发布消息的函数
let produce;
// 用于存储消费者函数的数组
const consumers = [];
// 创建一个Promise实例
const promise = new Promise((resolve, reject) => {
// 定义发布消息的函数produce
produce = (message) => {
// 当调用produce函数时,通过resolve发布消息
resolve(message);
}
});
// 当Promise状态变为resolved时,执行这个回调函数
promise.then((message) => {
// 如果没有消费者订阅
if (consumers.length === 0) {
console.log('no consumer');
return;
}
// 遍历消费者数组,依次调用每个消费者函数处理消息
consumers.forEach((consume) => {
consume(message);
});
});
// 定义添加消费者的函数
function addConsumer(consumer) {
// 检查传入的consumer是否是函数
if (typeof consumer!== 'function') {
console.log('consumer is not a function');
return;
}
// 如果是函数,则添加到消费者数组中
consumers.push(consumer);
}
// 返回包含发布消息函数和添加消费者函数的对象
return {
produce,
addConsumer,
};
}
// 测试
const { produce, addConsumer } = ProducerConsumerPattern();
addConsumer(console.log); // hello
addConsumer((message) => {
console.log(`${message} another consumer`);
});
produce('hello');
上面这段代码,整体逻辑是这样的:
- 先定义了
ProducerConsumerPattern
函数,在这个函数内部,声明了produce
变量和consumers
数组。produce
用来发布消息,consumers
用来存放所有的消费者函数。 - 通过
Promise
的构造函数创建了一个promise
实例,在这个实例内部定义了produce
函数,它调用resolve
方法发布消息。 promise.then
用于监听resolve
发布的消息,当有消息发布时,如果有消费者(consumers
数组不为空),就依次执行每个消费者函数来处理消息。addConsumer
函数负责把传入的消费者函数添加到consumers
数组里,不过会先检查传入的是不是函数。- 最后进行测试,先获取
produce
和addConsumer
函数,然后添加两个消费者,一个直接打印消息,另一个在消息后添加内容再打印,最后调用produce
发布消息。
五、测试结果
运行上面的测试代码后,控制台输出如下:
hello
hello another consumer
可以看到,成功实现了发布订阅的效果,生产者发布的消息被消费者正确接收并处理了。
六、总结
通过这次实践,我们利用Promise的resolve
和then
方法,成功实现了一个简单的发布订阅模式。在这个模式里,生产者用resolve
发布消息,消费者通过then
来订阅和处理消息。虽然这个模式比较简单,但在一些小型项目或者简单的异步消息传递场景中,还是挺实用的。如果大家对Promise和发布订阅模式感兴趣,不妨自己动手试试,说不定能发现更多有趣的应用场景。