JS中的非同步操作總結

前端晉級攻城獅發表於2019-05-28

DOM Events

XMLHttpRequest

fetch

WebSockets

Server Send Events

Service Worker

Node Stream

Timer

1、回撥函式  ajax典型的非同步操作,利用XMLHttpRequest,回撥函式獲取伺服器的資料傳給前臺   回撥函式的含義就是耗時任務f1中執行f2,f1不會堵塞住,而是先執行f2,再延遲執行f1

2、事件監聽

 addEventListener

 當監聽事件發生時,先執行回撥函式,再對監聽事件進行改寫   3、觀察者模式,也叫訂閱釋出模式

 多個觀察者可以訂閱同一個主題,主題物件改變時,主題物件就會通知這個觀察者

 其中步驟包括,訂閱、釋出、退訂;先訂閱(subscribe)一個主題物件,根據主題物件釋出(publish)內容,期間也退訂(unsubscribe)主題物件,一旦退訂就無法再次釋出

 可以把訂閱一個主題物件理解成監聽一個事件   觀察者模式的一個特點就是一旦主題事件一改變,就會通知整個觀察者;觀察者模式還可以計算出訂閱事件的個數

4、promise

 promise第一個特點:物件狀態不受外界影響,有三個狀態pending(),fulfilled(),rejected(),只有非同步操作才會更改這個狀態,其他操作無法改變這個狀態   promise第二個特點:一旦狀態改變,pending->fulfilled或pending->rejected,狀態就會凝固住,稱為resolve,通過promise的回撥函式可以立即得到這個結果,與事件監聽不同,一旦事件錯誤,就無法再次監聽

promise第三個特點:避免了回撥函式的層層巢狀,實際上寫promise時,雖然沒有回到函式的層層巢狀,但是又有then的巢狀,這個又有新的解決方法

promise第一個缺點:一旦promise建立,就會立即執行,無法中途停止

 promise的第二個缺點:promise不設定回撥函式,丟擲的錯誤無法在外部捕獲   piomise的第三個缺點:處於pending狀態,無法知道進展到哪個狀態

5、es7語法糖async/await

  sync非同步函式是promise的完成狀態,async函式直接then去獲取狀態改變值,catch來獲取錯誤    await只允許在async內部使用,就是async非同步函式內部想要繼續then,就可以採用await非同步函式,await非同步函式是內部的async非同步函式   async極大精簡了promise的操作  

相關文章