本文為您列出了邊緣程序ER(EdgeRoutine)的waitUntil相關的常見問題。
為什么Fetch請求有時能完成,有時不能完成?
Fetch請求有時能完成,有時不能完成的原因如下:
受生命周期限制
當您調用
addEventListener
注冊事件回調函數時,會自動創建上下文。當您的主回復結束,即調用event.respondWith
返回的Response對象被讀取完畢(包括header、body)后會結束上下文。所有異步函數的生命周期都在上下文生命周期之內,您在回調函數中await的Promise會阻塞當前的回調函數,直到該Promise被resolve。如果您不想await,則可以使用event.waitUntil函數,該函數會延長上下文的生命周期,直到所有被waitUntil的Promise執行完畢。
受共享狀態影響
多個上下文之間不能共享狀態,任何非JS標準的數據結構都不支持跨上下文共享,例如Service Worker API的數據結構、Stream對象。當上下文A使用非上下文A的對象時,會被ER檢測出來并拋出異常。
說明您可以使用JS的原生對象共享狀態,例如String、Array、Object和數字等,您自己編寫的Class也可以用于共享狀態。
受并發影響
所有沒有被await的Promise都是并發的,如果您希望ER程序能立即回復瀏覽器,可以不await子請求,直接使用waitUntil保證程序正常執行。
受異步錯誤影響
如果waitUntil中的子請求有一個出錯,整個上下文會被立刻退出。
waitUntil可以調用多次嗎?
waitUntil可以調用多次,也可以嵌套waitUntil,即一個waitUntil的Promise被resolve,其回調函數中繼續調用waitUntil。
上下文有時間限制,超過時間的上下文會被強制退出。