非同步處理的通用模型
阿新 • • 發佈:2020-10-22
8-2. 非同步處理的通用模型
ES官方參考了大量的非同步場景,總結出了一套非同步的通用模型,該模型可以覆蓋幾乎所有的非同步場景,甚至是同步場景。
值得注意的是,為了相容舊系統,ES6 並不打算拋棄掉過去的做法,只是基於該模型推出一個全新的 API,使用該API,會讓非同步處理更加的簡潔優雅。
理解該 API,最重要的,是理解它的非同步模型
- ES6 將某一件可能發生非同步操作的事情,分為兩個階段:unsettled 和 settled
- unsettled: 未決階段,表示事情還在進行前期的處理,並沒有發生通向結果的那件事
- settled:已決階段,事情已經有了一個結果,不管這個結果是好是壞,整件事情無法逆轉
事情總是從 未決階段 逐步發展到 已決階段的。並且,未決階段擁有控制何時通向已決階段的能力。
- ES6將事情劃分為三種狀態: pending、resolved、rejected
- pending: 掛起,處於未決階段,則表示這件事情還在掛起(最終的結果還沒出來)
- resolved:已處理,已決階段的一種狀態,表示整件事情已經出現結果,並是一個可以按照正常邏輯進行下去的結果
- rejected:已拒絕,已決階段的一種狀態,表示整件事情已經出現結果,並是一個無法按照正常邏輯進行下去的結果,通常用於表示有一個錯誤
既然未決階段有權力決定事情的走向,因此,未決階段可以決定事情最終的狀態!
我們將 把事情變為resolved狀態的過程叫做:resolve
我們將 把事情變為rejected狀態的過程叫做:reject,推向該狀態時,同樣可能會傳遞一些資料,通常為錯誤資訊
始終記住,無論是階段,還是狀態,是不可逆的!
- 當事情達到已決階段後,通常需要進行後續處理,不同的已決狀態,決定了不同的後續處理。
- resolved狀態:這是一個正常的已決狀態,後續處理表示為 thenable
- rejected狀態:這是一個非正常的已決狀態,後續處理表示為 catchable
後續處理可能有多個,因此會形成作業佇列,這些後續處理會按照順序,當狀態到達後依次執行
- 整件事稱之為Promise
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ZGHsvyg4-
理解上面的概念,對學習Promise至關重要!