这个想法来源于程序员成长指北的一篇公众号文章,正好在学习promise,看到还挺有趣的,就按自己的理解复现了一下
利用 Promise 实现简单的发布订阅模式
需求描述
利用 resolve 方法和 then 方法实现一个简单的发布订阅者模式。
需求拆解
- 将
resolve方法暴露出去,作为生产者(Producer)。 - 将
then方法暴露出去,作为消费者(Consumer)。
实现思路
- 定义一个
produce方法,用于发布消息,基于resolve方法。 - 定义一个
addConsumer方法,用于添加订阅者。 - 接受消息并执行相应操作,基于
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');
测试结果
总结
通过 Promise 的 resolve 和 then 方法,我们实现了一个简单的发布订阅模式。生产者通过 resolve 发布消息,消费者通过 then 订阅并处理消息。这种模式适用于简单的异步消息传递场景。