如何用Promise实现发布订阅模式

前端 潘老师 1个月前 (03-13) 23 ℃ (0) 扫码查看

大家知道如何使用Promise实现发布订阅模式吗?感觉挺有意思,就自己动手实践了一把,今天来给大伙分享分享。

一、啥是发布订阅模式?要解决啥问题?

发布订阅模式,简单来说,就是一种消息通信模式。在这个模式里,有生产者和消费者。生产者负责发布消息,消费者呢,负责接收并处理这些消息。打个比方,你在电商平台上关注了某个店铺(相当于订阅),店铺上新(发布消息)后,你就能收到通知(处理消息),这就是典型的发布订阅场景。咱们今天要用Promise来实现一个简单的发布订阅模式。

二、需求分析

这次的需求就是利用Promise里的resolve方法和then方法,打造一个简易的发布订阅者模式。具体拆分开来,就是把resolve方法当成生产者发布消息的途径,把then方法作为消费者接收和处理消息的方式。

三、实现思路详解

  1. 定义发布消息的函数:得写一个produce函数,这个函数基于resolve方法,专门用来发布消息。
  2. 添加订阅者的函数:还需要一个addConsumer函数,用它来添加那些订阅消息的消费者。
  3. 消息处理机制:通过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数组里,不过会先检查传入的是不是函数。
  • 最后进行测试,先获取produceaddConsumer函数,然后添加两个消费者,一个直接打印消息,另一个在消息后添加内容再打印,最后调用produce发布消息。

五、测试结果

运行上面的测试代码后,控制台输出如下:

hello
hello another consumer

可以看到,成功实现了发布订阅的效果,生产者发布的消息被消费者正确接收并处理了。

六、总结

通过这次实践,我们利用Promise的resolvethen方法,成功实现了一个简单的发布订阅模式。在这个模式里,生产者用resolve发布消息,消费者通过then来订阅和处理消息。虽然这个模式比较简单,但在一些小型项目或者简单的异步消息传递场景中,还是挺实用的。如果大家对Promise和发布订阅模式感兴趣,不妨自己动手试试,说不定能发现更多有趣的应用场景。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/front/15872.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】