談談javascript非同步哪些事

陳杰就是我發表於2018-06-16

#一. 前言

JS 是單執行緒的語言,所謂“單執行緒”,這種模式的好處是實現起來比較簡單,執行環境相對單純;壞處是隻要有一個任務耗時很長,後面的任務都必須排隊等著,會拖延整個程式的執行。常見的瀏覽器無響應(假死),往往就是因為某一段Javascript程式碼長時間執行(比如死迴圈),導致整個頁面卡在這個地方,其他任務無法執行 ,因此出現了非同步

#二.什麼是非同步

     console.log('a') ;
     setTimeout(function(){console.log('b');},2000);
     console.log('c')
複製程式碼

以上一共三行程式碼,該程式被執行的時候,會依次挨行執行
    第一步,執行第一行,將結果a列印出來
    第二步,執行第二行,注意此時會將這個操作暫時儲存到其他地方,因為setTimeout是一個非同步執行操作。
    第三步,執行第三行,將結果c列印出出來
    第四步,等待最後一行程式(一共三行)都全部執行完了,然後立馬實時檢視剛才暫存的非同步操作有沒有。如果有可執行的,就立即拿到出來繼續執行。
    第五步,執行完畢之後,再實時檢視暫存位置中是否還有未執行的非同步回撥。
所謂非同步就是當程式碼執行的該位置時不在等待它執行完了在去執行下面的程式碼,而是儲存到其他地方先執行下面的程式碼,從而解決了瀏覽器無響應(假死)的問題。

#三.”非同步模式”程式設計的幾種方法:

(1)回撥函式:優點是簡單、容易理解和部署,缺點是不利於程式碼的閱讀和維護,各個部分之間高度耦合(Coupling),使得程式結構混亂、流程難以追蹤(尤其是回撥函式巢狀的情況),而且每個任務只能指定一個回撥函式。

(2)採用事件驅動模式(事件監聽):優點是比較容易理解,可以繫結多個事件,每個事件可以指定多個回撥函式,而且可以”去耦合“(Decoupling),有利於 實現模組化。缺點是整個程式都要變成事件驅動型,執行流程會變得很不清晰

(3)觀察者模式:這種方法的性質與”事件監聽”類似,但是明顯優於後者。因為我們可以通過檢視”訊息中心”,瞭解存在多少訊號、每個訊號有多少訂閱者,從而監控程式的執行。

#四.淺談觀察者模式

最近剛好學了這個模式,就選擇這個模式來談談,觀察者模式比較概念的解釋是,目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新介面。具體觀察者和具體目標繼承各自的基類,然後具體觀察者把自己註冊到具體目標裡,在具體目標發生變化時候,排程觀察者的更新方法。

談談javascript非同步哪些事

觀察者模式實現程式碼(JavaScript版):

談談javascript非同步哪些事

參考:www.cnblogs.com/lovesong/p/…

相關文章