一、實現思路
根據Promise.race的特性,我們在Promise.race里面添加兩個任務,一個是正常的網絡請求任務A,另外一個便是網絡延時任務B,網絡延時可以利用setTimeout方法實現。
這個時候會有三種情況出現:
1.A任務在8秒內完成(假定8秒超時),Promise.race任務正常結束。
2.超過8秒A任務仍然未完成,由B任務計時結束自動中斷Promise.race。
3.發生異常,Promise.race自動結束。
針對以上三種情況來設計網絡超時方案。
這個時候會有三種情況出現:
1.A任務在8秒內完成(假定8秒超時),Promise.race任務正常結束。
2.超過8秒A任務仍然未完成,由B任務計時結束自動中斷Promise.race。
3.發生異常,Promise.race自動結束。
針對以上三種情況來設計網絡超時方案。
二、代碼
HttpUtil.js
//先定義延時函數 const delay = (timeOut = 8*1000) =>{ return new Promise((resolve,reject) =>{ setTimeout(() =>{ reject(new Error('網絡超時'); },timeOut); }) } //fetch網絡請求 const fetchPromise = (method,url, formData) =>{ return new Promise((resolve, reject) => { fetch(url,{ method: method, body:formData }).then((response) => { if (response.ok) { return response.json(); } else { reject(new Error('服務器異常')); } }).then((responseJson) => { resolve (responseJson); }).catch((err) => { reject(new Error(err); }) }) } //race任務 const _fetch = (fetchPromise, timeout) => { return Promise.race([fetchPromise,delay(timeout)]); } //post const HttpPost = (url, formData,timeout = 8*1000) =>{ return _fetch(fetchPromise('POST', url, formData), timeout); }; //get const HttpGet = (url,timeout = 8*1000) =>{ return _fetch(fetchPromise('Get', url), timeout); };
export {HttpPost ,HttpGet}
參考:
https://www.jianshu.com/p/2df7c6e3b3c3
本博客地址: wukong1688
本文原文地址:https://www.cnblogs.com/wukong1688/p/10963004.html
轉載請著名出處!謝謝~~
