處理可能超時的異步操作
作者:邊城
簡介:從事軟件開發(fā) 20 年,在軟件分析、設(shè)計、架構(gòu)、開發(fā)及軟件開發(fā)技術(shù)研究和培訓(xùn)等方面有著非常豐富的經(jīng)驗,近年主要在研究 Web 前端技術(shù)、基于 .NET 的后端開發(fā)技術(shù)和相關(guān)軟件架構(gòu)。
來源:SegmentFault ?思否社區(qū)
Axios 自帶超時處理
try?{
????const?res?=?await?axios.get(url,?options);
????//?TODO?正常進行后續(xù)業(yè)務(wù)
}?catch(err)?{
????//?TODO?進行容錯處理,或者報錯
}
try?{
????showLoading();
????const?res?=?await?axios.get(url,?options);
????//?TODO?正常業(yè)務(wù)
}?catch?(err)?{
????//?TODO?容錯處理
}?finally?{
????hideLoading();
}
try?{...}
catch?(err)?{
????if?(err.isAxiosError?&&?!err.response?&&?err.request
????????&&?err.message.startsWith("timeout"))?{
????????//?如果是?Axios?的?request?錯誤,并且消息是延時消息
????????//?TODO?處理超時
????}
}
finally?{...}
處理 fetch() 超時
const?ac?=?new?AbortController();
const?{?signal?}?=?ac;
fetch(url,?{?signal?}).then(res?=>?{
????//?TODO?處理業(yè)務(wù)
});
//?1?秒后取消?fetch?操作
setTimeout(()?=>?ac.abort(),?1000);
const?ac?=?new?AbortController();
const?{?signal?}?=?ac;
setTimeout(()?=>?ac.abort(),?1000);
const?res?=?await?fetch(url,?{?signal?}).catch(()?=>?undefined);?
async?function?fetchWithTimeout(timeout,?resoure,?init?=?{})?{
????const?ac?=?new?AbortController();
????const?signal?=?ac.signal;
????setTimeout(()?=>?ac.abort(),?timeout);
????return?fetch(resoure,?{?...init,?signal?});
}
setTimeout(()?=>?{
????console.log("It's?timeout");
????ac.abort();
},?timeout);
fetchWithTimeout(5000,?url).then(res?=>?console.log("success"));
async?function?fetchWithTimeout(timeout,?resoure,?init?=?{})?{
????const?ac?=?new?AbortController();
????const?signal?=?ac.signal;
????
????const?timer?=?setTimeout(()?=>?{
????????console.log("It's?timeout");
????????return?ac.abort();
????},?timeout);
????
????try?{
????????return?await?fetch(resoure,?{?...init,?signal?});
????}?finally?{
????????clearTimeout(timer);
????}
}
萬物皆可超時
function?waitWithTimeout(promise,?timeout,?timeoutMessage?=?"timeout")?{
????let?timer;
????const?timeoutPromise?=?new?Promise((_,?reject)?=>?{
????????timer?=?setTimeout(()?=>?reject(timeoutMessage),?timeout);
????});
????return?Promise.race([timeoutPromise,?promise])
????????.finally(()?=>?clearTimeout(timer));????//?別忘了清?timer
}
(async?()?=>?{
????const?business?=?new?Promise(resolve?=>?setTimeout(resolve,?1000?*?10));
????try?{
????????await?waitWithTimeout(business,?1000);
????????console.log("[Success]");
????}?catch?(err)?{
????????console.log("[Error]",?err);????//?[Error]?timeout
????}
})();
-?END -

評論
圖片
表情
