2023年9月20日 星期三

fetch timeout

 前言:上篇提到我加了@vite/plugin-lagacy讓畫面成功渲染了,但打某支api卻會報錯promise rejection.....

我一開始想說是不是沒有支援Promise,我一直嘗試在polyfills塞入各種套件,但始終沒有解決。一直到我後來思考,不對啊,首頁就打了數隻api都沒事,為什麼到該頁打該api才會報!應該是該api有問題,但看來看去底層是一樣的,為什麼只有這隻會報.....

最終找不到辦法,因為我手上也頂多只有6s手機,無法進行除錯,只好到這個網站:https://vikyd.github.io/download-chromium-history-version/#/,下載舊版的chromium看能否模擬事件發生。好在在46版時發生了,然後我在報錯訊息中多看到幾個字“AbortController”,原來是我為了讓fetch有timeout,所以使用了這個物件,但這個物件載舊版瀏覽器上沒有,所以報錯,並非是沒有promise polyfill,所以我把AbortController加上一些判斷如下

if (typeof AbortController == "function") {
const controller = new AbortController()
const timeout = 5000
setTimeout(() => {
controller.abort()
}, timeout)
obj = { ...obj, signal: controller.signal }
}

fetch(url, obj)
.then((res) => {
......
return res.json()
})

變成有就5秒timeout沒有就預設30秒,呵呵,事情就解決了!!撒花~~



沒有留言:

張貼留言