使用「设计模式」巧妙解决 BUG 的经历,妙啊~

开发
本文利用了发布订阅模式这种设计模式,来解决我们日常的一些简单业务。

是这样的,这天,我接到了一个 BUG,当然这个 BUG 不是我写的,是这样的有两个页面:

  • 页面 A:有同步代码,有异步代码
  • 页面 B:全是同步代码

注意:此项目是老项目,没有全局状态管理工具!!!

// 页面A
console.log(1)
console.log(2)
http.get(url).then(res => {
  console.log(3)
  localStorage.setItem(key, res)
})

// 页面B
console.log(
  localStorage.getItem(key)
)

然后这两个页面是先后加载的,那么我们可以得出输出顺序是:

1 // 页面A
2 // 页面A
undefined // 页面B
console.log(3) // 页面A

因为请求是异步的,导致页面B那边拿不到 localStorage 里面的东西,而无法完成很多操作,导致了出现 BUG。所以得想想怎么去解决这个 BUG。

定时器

最简单的就是利用定时器去解决:

// 页面B
setTimeout(() => {
  console.log(
  localStorage.getItem(key)
  )
})

但是这样是不对的,不好维护,滥用定时器会导致以后可能会有新的 BUG 出现!!!

发布订阅模式

所以还是使用发布订阅,首先实现一个发布订阅中心,以下是简单实现:

type Callback<T> = (data: T) => void;

class PubSub<T> {
  private subscribers: Callback<T>[] = [];

  subscribe(callback: Callback<T>): void {
    this.subscribers.push(callback);
  }

  unsubscribe(callback: Callback<T>): void {
    this.subscribers = this.subscribers.filter(fn => fn !== callback);
  }

  publish(data: T): void {
    this.subscribers.forEach(fn => fn(data));
  }
}

export const ps = new PubSub();

接着就可以用它来解决我们那个 BUG 了!!

// 页面A
console.log(1)
console.log(2)
http.get(url).then(res => {
  console.log(3)
  localStorage.setItem(key, res)
  ps.publish(res)
})

// 页面B
// 订阅
ps.subscribe((res) => {
  console.log(res)
  console.log(
    localStorage.getItem(key)
  )
})

现在的输出顺序就是:

1 // 页面A
2 // 页面A
console.log(3) // 页面A
res // 页面B
res // 页面B

小结

这就是利用了 发布订阅模式 这种设计模式,来解决我们日常的一些简单业务,所以大家可以多用,这样在面试时就不怕面试官问你啦!

责任编辑:赵宁宁 来源: 前端之神
相关推荐

2022-06-27 08:01:55

动画CSS前端

2022-05-17 07:26:33

动画CSS前端

2022-02-17 13:46:15

SSH命令内网

2011-05-12 13:07:28

SQL Server复制漏洞

2021-02-02 21:42:30

VS Code编辑器开发

2022-05-16 08:57:36

Python可视化代码

2021-03-26 00:00:05

​JavaMap设计

2021-05-08 10:36:31

开发Java Map

2013-11-11 15:15:38

设计用户体验

2009-03-02 10:13:00

交换机端口模式

2009-03-17 09:37:00

ADSL分流宽带接入

2010-08-31 13:56:38

PHP5多线程

2009-02-19 10:14:00

2009-01-15 09:49:00

网络地址切换

2017-11-27 11:26:35

程序员Bug调试

2022-09-19 06:25:14

设计模式GoF

2009-06-22 16:24:33

JSF框架中使用的设计

2014-08-08 16:17:49

shell脚本linux

2009-06-24 17:21:23

JSF框架设计模式

2020-05-06 19:16:45

Windows 10Windows微软
点赞
收藏

51CTO技术栈公众号