基于promise实现简单的发布订阅者模式

94 阅读1分钟

这个想法来源于程序员成长指北的一篇公众号文章,正好在学习promise,看到还挺有趣的,就按自己的理解复现了一下


利用 Promise 实现简单的发布订阅模式

需求描述

利用 resolve 方法和 then 方法实现一个简单的发布订阅者模式。

需求拆解

  • resolve 方法暴露出去,作为生产者(Producer)。
  • then 方法暴露出去,作为消费者(Consumer)。

实现思路

  1. 定义一个 produce 方法,用于发布消息,基于 resolve 方法。
  2. 定义一个 addConsumer 方法,用于添加订阅者。
  3. 接受消息并执行相应操作,基于 then 方法。

代码实现

function ProducerConsumerPattern() {
    let produce;
    const consumers = [];

    const promise = new Promise((resolve, reject) => {
        produce = (message) => {
            resolve(message);
        }
    });

    promise.then((message) => {
        if (consumers.length === 0) {
            console.log('no consumer');
            return;
        }
        consumers.forEach((consume) => {
            consume(message);
        });
    });

    function addConsumer(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');

测试结果

QQ_1741851910737.png


总结

通过 Promiseresolvethen 方法,我们实现了一个简单的发布订阅模式。生产者通过 resolve 发布消息,消费者通过 then 订阅并处理消息。这种模式适用于简单的异步消息传递场景。