本文為您列出了邊緣程式ER(EdgeRoutine)的waitUntil相關的常見問題。
為什麼Fetch請求有時能完成,有時不能完成?
Fetch請求有時能完成,有時不能完成的原因如下:
- 受生命週期限制
當您調用
addEventListener
註冊事件回呼函數時,會自動建立上下文。當您的主回複結束,即調用event.respondWith
返回的Repsonse對象被讀取完畢(包括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,即一個waitUntil的Promise被resolve,其回呼函數中繼續調用waitUntil。
说明
上下文有即時間限制,超過即時間的上下文會被強制退出。