B站面试题:如何解决发布订阅模式中的循环问题

来源:8-16 手写EventBus自定义事件-包括on和once

infjer

2022-03-21

老师好,这节内容我想起了之前在B站面试时遇到的问题,面试官让我手写一个发布订阅模式,当时把伪代码和思路给讲出来了(看过设计模式一书)。然后面试官追问了一句,如何解决发布订阅模式中的循环问题,比如:

const A = () => {
	// 一些处理
	e.emit('y')
}
const B = () => {
	// 一些处理
	e.emit('x')
}

e.on('x', A)
e.on('y', B)

e.emit('x')

然后当时我就😳懵了,因为书上没写。所以,我想问的是,这个问题,面试官想考察的是啥啊?该如何回答?

写回答

4回答

宅到深处自然萌

2025-07-08

不过一个防止内存泄漏的方法:设置递归层级,如果过深,就结束

eventEmitter.emit = function(eventName) {
    if (this.currentLevel >= this.maxLevel) {
        return;
    }
    this.currentLevel++;
    const callbacks = this.events[eventName] || [];
    callbacks.forEach(callback => callback());
    this.currentLevel--;};


0
0

宅到深处自然萌

2025-07-08

解决此问题最好的方法就是解决写这种代码的人

0
0

GZ77

2023-05-03

这不是内存泄漏吗?

0
0

双越

2022-03-21

好问题。

避免循环最常用的方式就是记录,例如用一个 Set ,每次 emit 就记录下 key ,然后判断是否有循环的 key 。可以照这个思路思考一下。

0
2
qq_confession十_0
能不能放到链表里面,如果判断链表闭环了,就不执行了。
2022-05-10
共2条回复

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1535 学习 · 654 问题

查看课程