是這樣的,這天,我接到了一個 BUG,當然這個 BUG 不是我寫的,是這樣的有兩個頁面:
注意:此項目是老項目,沒有全局狀態(tài)管理工具!!!
// 頁面Aconsole.log(1)console.log(2)http.get(url).then(res => { console.log(3) localStorage.setItem(key, res)})// 頁面Bconsole.log( localStorage.getItem(key))
然后這兩個頁面是先后加載的,那么我們可以得出輸出順序是:
1 // 頁面A2 // 頁面Aundefined // 頁面Bconsole.log(3) // 頁面A
因為請求是異步的,導(dǎo)致頁面B那邊拿不到 localStorage 里面的東西,而無法完成很多操作,導(dǎo)致了出現(xiàn) BUG。所以得想想怎么去解決這個 BUG。
最簡單的就是利用定時器去解決:
// 頁面BsetTimeout(() => { console.log( localStorage.getItem(key) )})
但是這樣是不對的,不好維護,濫用定時器會導(dǎo)致以后可能會有新的 BUG 出現(xiàn)!!!
所以還是使用發(fā)布訂閱,首先實現(xiàn)一個發(fā)布訂閱中心,以下是簡單實現(xiàn):
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 了!!
// 頁面Aconsole.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) )})
現(xiàn)在的輸出順序就是:
1 // 頁面A2 // 頁面Aconsole.log(3) // 頁面Ares // 頁面Bres // 頁面B
這就是利用了 發(fā)布訂閱模式 這種設(shè)計模式,來解決我們?nèi)粘5囊恍┖唵螛I(yè)務(wù),所以大家可以多用,這樣在面試時就不怕面試官問你啦!
本文鏈接:http://www.tebozhan.com/showinfo-26-95149-0.html使用「設(shè)計模式」巧妙解決 BUG 的經(jīng)歷,妙啊~
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: C++模板增強,模板編程更上一層樓