Suspense不僅能用於API數據提取範圍,還可以應用於任何非同步數據流,例如,code split或assents loading。 React.lazy與Suspense特性已經在React穩定版本中發布,其允許用戶輕鬆對動態載入bundle進行拆分,而無需手動處理載入狀態。包含數據獲取功能的Suspense完全版本必須等到今年晚些時候,但已經可以通過當前的alpha版本進行體驗。
通常的想法是, Suspense允許組件「suspend」它們的渲染。例如,如果他們需要從外部來源載入額外數據,一旦所有依賴的資源(數據或資源文件)都存在了,React將重新嘗試渲染組件。為了實現上面描述的功能,React使用Promises。組件可以在其render方法中拋出Promise(或者在組件渲染期間調用的任何東西,例如新的靜態方法getDerivedStateFromProps); React捕獲拋出的Promise並在組件樹上查找最接近的Suspense組件,它充當一種邊界;Suspense組件接受一個組件作為fallback prop,當其子樹中的任何子項被掛起時,都會呈現該元素。React還會跟蹤拋出的Promise。一旦promise被resolve了,就會再次渲染組件。這假定由於Promise被resolve,被suspend的組件現在已經獲取了能夠正確渲染所需的所有信息。為此,我們使用某種形式的緩存來存儲數據,在每次渲染時,我們通過這個緩存來確定數據是否已經可用(然後它只是從變數中讀取它), 在這種情況下它會觸發fetch,並拋出Promise的結果來讓React捕獲。如上所述,這不僅適用於data fetching,任何可以使用Promise描述的非同步操作都適用,code split是一個非常明顯和流行的例子。
Suspense的核心概念與error boundaries非常相似,error boundaries在React 16中引入,允許在應用程序內的任何位置捕獲未捕獲的異常,然後在組件樹中展示跟錯誤信息相關的組件。以同樣的方式,Suspense組件從其子節點捕獲任何拋出的Promises,不同之處在於對於Suspense我們不必使自定義組件充當邊界,Suspense組件就是那個邊界;而在error boundary中,我們需要為邊界組件定義(componentDidCatch)方法。