㈠ 前端如何盡量正確地處理ajax的異常
如今前端領域是MVVM框架的天下,組件庫也層出不窮,但是,並沒有一個知名的組件庫提供ajax異常的成熟解決方案,所以今天我們就來研討一下,如何盡量正確地處理異常。
從業務上簡單說,凡是code不是200的,都是異常。這里code可以是HTTP狀態碼,也可以是響應體的code,就不細究了,反正本質沒差別。然後,根據code的不同,又可以細分成401 403 404 500等等。
如果你的後端夥伴以HTTP狀態碼表示404,以響應體code表示其他錯誤,而且你又無法勸說他們,那麼你應在axios的攔截器里把各種情況全考慮進去,比如:
超時很簡單,axios也支持,設定超時閾值即可。超時跟無響應的區別是,超時意味著HTTP三次握手成功,但是得不到響應體,瀏覽器知道介面是存在的,但是響應體又在規定時間內沒有拿到。無響應是根本無法HTTP握手,也就無法獲知介面存在。
處理超時,通常做法是在攔截器里重新請求一遍,還是超時的話就視為伺服器錯誤。
得不到響應又分成2種,可能是網斷了,也可能是伺服器停機了。
苛刻地說,你應分辨這2種情況,並給出不同的提示,畢竟網斷了,用戶可以尋找別的聯網方式,而伺服器停機了就給個重連按鈕,讓用戶有事沒事的嘗試重連一下。
關於解決方案,首先說,XHR對象無法區分到底斷網還是伺服器停機,axios對於2種情況都返回'Network Error'。在得到這個反饋之後,你接下來可以有這2種解決辦法:
你可以將 https://api.map..com/images/blank.gif 改成其他伺服器穩定且位元組小的圖片。或許你可以做一張幾位元組的圖片,傳到一個非常牛逼的CDN上。
MDN手冊: https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/connection
它不支持IE,就算你不在乎這一點,那麼它是不是一定準呢?對於需要登錄的VPN網路,它是否准呢?我也不知道,總體說,它真的不是最佳的方案。我推薦用方案1。
很簡單,分為3種:
通常,一個介面,只需要按照其中一種去處理即可,優先順序就是上面書寫順序。
容器內錯誤提示肯定是內容區的介面出錯才會出現。
處理方式:
局部報錯比較容易理解,比如一個List的介面出錯,那麼,上策是應當給這個容器盡量撐高到有內容時的高度,然後居中給一個錯誤圖標和錯誤描述。中策是不考慮有內容時候的高度,只讓錯誤提示和錯誤描述撐起一定高度即可。都不算錯。如果容器很小,比如就是一個3位數值,那麼用一個 - 表示錯誤也可以。
頁面整體報錯稍微復雜,比如一個左右結構的內容管理系統,前置介面有userInfo介面、全局字典介面、全局路由介面等,這些介面與眾不同的地方在於它們是基礎介面,它們出錯的話,網站乾脆就不能用,頁面骨架也是錯亂的,這種情況下可以有2種解決辦法:一是跳轉到專門的5xx報錯頁面,頁面中央有錯誤圖標、錯誤提示,以及「返回上一頁」的按鈕;二是用白板遮罩覆蓋瀏覽器視口,居中放一個錯誤圖標和錯誤文字以及「刷新頁面」的按鈕,本質是用一個fixed的遮罩壓住瀏覽器全部面積。用哪種方案都可。所以你要做的是決定哪些介面屬於全局報錯,哪些介面屬於局部報錯,並做不同的處理。
報錯內容:
根據ajax異常的分類,可能至少能分出3種:網路錯誤、伺服器宕機、伺服器錯誤。具體用什麼圖標和文字我就不多說了。
組件化:
容器內報錯應盡量組件化。該放返回上一頁或刷新按鈕的,一定要放按鈕。
排他性:
只要做了容器內報錯,就不要做另外報錯了。這也說明了一點,就是在axios攔截器里彈toast或者modal是愚蠢的方案,我在別的文章也提到過這種觀點。不做容器內報錯的情況,才應該考慮其他3種情況。
什麼樣的場景下使用容器隱藏?
比如頁面有一個角落顯示你的粉絲數、關注數、評論量……。如果有獲取到數據,則讓這個容器出現,沒有的話,則容器就保持隱藏。這一類場景往往應用於非主要內容,比如側邊欄的小內容塊。
由於這只適用於非主要內容,那麼主要內容也會有它自己的報錯,所以,你不必擔心用戶看不到「網路出錯」這類錯誤提示。
先簡單對比一下toast和modal。
很簡單,toast就是輕提示,不需要手動關閉,modal就是重提示,需要手動關閉。採用哪個,只要站在用戶角度思考問題就好了。比如有人說,異常應當用重提示。可以這么絕對化么?不可以。比如你在某個頁面點贊,提示你 「您已經點過贊了」 ,這用重提示嗎?肯定toast就夠了。同樣的,成功提示一定用輕提示嗎?比如提示 「感謝參與,工作人員將在3~5個工作日內聯系你」 ,這么長,能toast?能一閃而過?
什麼介面適用彈出提示?簡單說,只要跟UI顯示不相乾的,都最好是使用彈出提示。比如這幾種場景:
先說上傳數據斷網之類的錯誤,通常用modal,因為modal能夠攔截用戶動作,避免重復上傳,而且,還能給用戶足夠的時間讓用戶看清楚出錯原因,避免無謂的重試。
然後說數據內容錯誤,無論是表單提交,還是點個贊,錯誤提示一般用toast,畢竟用戶可能只是不小心填錯的,看一眼然後趕緊改正就好了。
最後說401錯誤,有2種做法,一是用modal,因為一般要強制用戶轉到登錄頁,但是轉之前也得讓用戶看明白為什麼要轉,所以可以先modal提示,點擊確定就跳轉到登錄頁;二是用toast,但是需要先跳轉,然後在登錄頁上提示toast「請先登錄」。
警告條
警告條是可關閉的、永久生命的、又不妨礙用戶繼續操作的彈出組件,一般在頁面頂部,或者在用戶操作區域的附近。什麼場景用警告條?
比如的MD編輯器,你只要輸入,就會自動給伺服器發送數據,頻率很快,有時候因為網路或者伺服器的問題,會出現保存失敗的可能性,這時候就會在頁面頂部出現一個比較長時間的警告條,告訴你保存失敗,但你依然可以繼續寫,什麼時候網路正常了,什麼時候toast才會自動消失,當然你也可以手動關閉它。
總之,toast、modal、警告條究竟什麼場合使用,要根據產品、業務具體而定,要注意優先使用容器內報錯和容器隱藏。
㈡ jquery ajax 怎麼判斷請求異常
responseTxt - 包含調用成功時的結果內容
statusTXT - 包含調用的狀態
xhr - 包含 XMLHttpRequest 對象
下面的例子會在 load() 方法完成後顯示一個提示框。如果 load() 方法已成功,則顯示"外部內容載入成功!",而如果失敗,則顯示錯誤消息:
實例
$("button").click(function(){
$("#div1").load("demo_test.txt",function(responseTxt,statusTxt,xhr){
if(statusTxt=="success")
alert("外部內容載入成功!");
if(statusTxt=="error")
alert("Error: "+xhr.status+": "+xhr.statusText);
});
});
㈢ $.ajax 執行時如何判斷網路是否斷線
我覺得上面的回答,理論上可行,但是實際操作時不靠譜
每次請求之前都還要想後台請求一次,開銷問題不容小覷
而且實際上,你也不能保證上次請求成功了就代表這次請求時還是保持網路暢通
我的解決方案是設置一個ajax的執行時間
如果網路擁堵或斷開時,客戶端這頭超過了規定時間即提示用戶
$.ajax({
url:"xxx",
//1秒後超時
timeout:1000,
error:function(xmlHttpRequest,error){
//提示超時或操作失敗
}
});
你用的本身就是jquery的框架,只要版本高,就不會出現兼容性問題
㈣ 如何檢測ajax因網路斷開或延時導致的錯誤並重連
$.ajax({
async:true,//true非同步,false同步
url:'',
data:$(this).serialize(),
type:'get',
dataType:'json',//xml,html,script,json,jsonp,text
complete:function(XHR,TS){alert('complete');},//完成回調函數(XHR,TS)
error:function(XMLHttpRequest,textStatus,errorThrown){
//XMLHttpRequest.readyState:
//0-(未初始化)還沒有調用send()方法
//1-(載入)已調用send()方法,正在發送請求
//2-(載入完成)send()方法執行完成,已經接收到全部響應內容
//3-(交互)正在解析響應內容
//4-(完成)響應內容解析完成,可以在客戶端調用了
//XMLHttpRequest.status:
//textStatus:"timeout","error","notmodified"和"parsererror"。
//(0)null
//(1)timeout超時
//(2)error
//(3)notmodified未修改
//(4)parsererror解析錯誤
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},//默認值:自動判斷(xml或html)。請求失敗時調用此函數。有以下三個參數:XMLHttpRequest對象、錯誤信息、(可選)捕獲的異常對象。
success:function(response){alert('success');}
});
可以通過error的狀態來判斷請求狀態,來做異常處理。
㈤ 網頁myjqueryajax request error是什麼意思怎麼解決
首先ajax返回500錯誤一般情況是伺服器端錯誤,一般可以採用ajax調試或者瀏覽器調試的方式查看錯誤。
方式1:ajax調試-
$.ajax({url:"ajax.php",//請求中頃的頁面地址 type:'post', //請求數據的方式 get post dataType:'text', //數據返賣差陸回的方式 text html json success:function(data) { //請求之後,響應慶洞成功執行 alert(data); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); }, });
方式2-瀏覽器調試:按下F12查看網路請求返回的錯誤原因。
㈥ telnet埠是通的但是ajax網路錯誤
telnet埠是通的但是ajax網路錯誤解決辦法:
1:打開軟體
2:編輯所需要的信息
3:然後編輯好了之後確認,點擊右上角的設置中心
4:在設置中心裏面找到信息就可以了
㈦ ie瀏覽器ajax請求異常
在ie9以下,你就要用兼容性寫法了。先確保js中不報錯,js報錯了就很容易不往下執行了。再看ajax參數格式是不是寫錯了,再看ajax的一些基本屬性寫沒寫,再找不到就打斷點一個一個地方測,最後在考慮是不是兼容性問題
望採納