是指在寫ajax非同步請求時該如果寫回調呢?寫啥回調呢?錯誤時觸發哪個回調呢?
常見的有:
$.post(url, {}, function(res){
}, 'json');
殊不知這種在出錯的時候沒有任何的處理。。。
通常我這樣寫:
$.ajax({
url: '',
data: {},
dataType: 'json',
type: 'POST',
success: function(res){},
error: function(){},
complete: function(){}
});
你可能在說,代碼可能有點多,其實我感覺只要業餘清晰,代碼多點也是能接受的,當然你可以用偉大的promise處理回調。。。在jquery裡她轉換成了deferred
一定要考慮的
緩衝問題,這個通常發生在ie低版本,如ie7,一般使用時間綴解決
loading的狀態,一定要讓使用者知道當前處理正在請求過程中
傳回值出錯,通常給予友好提示
伺服器出錯,其中包括404,500等狀態
網路逾時,一般有個時間限制
使用者主動插斷要求,如:abort
比如My Code片斷:
// 判斷邏輯,如果成功才發請求
// 給出loading狀態
// 發送請求,並所當前請求存放起來,以方便使用者主動清除
XHR = $.ajax({
url: '',
data: {},
dataType: 'json',
type: 'POST',
success: function(res){
if(res && res.errcode === 0){
// 成功
} else {
// 傳回值不理想
}
},
error: function(xhr, status){
// status => timeout,parsererror,error,abort
if(xhr && status !== 'abort'){
// 如果不是使用者主動中斷
}
},
complete: function(){
// 關閉loading
}
});
註:不管成功或者失敗都會執行complete回調,且是在error或success後執行
回調觸發的類型
error
錯誤回調,相當於fail
當後端出錯,或者伺服器狀態代碼不為200,會觸發error,第二參數為error
當傳回值解析錯誤時觸發error,第二個參數為parsererror
當響應逾時時觸發error,第二個參數為timeout
當使用者主動插斷要求時觸發error,第二個參數為abort
以上是在jquery和zepto中測試
success
成功回調,相當於done
在jquery中當返回狀態為200且內容正常解析後觸發
在zepto中當傳回值狀態為200且內容不為空白時觸發,這是一個坑啊。。。
complete
完成回調,相當於always
不管成功還是失敗,該事件總會執行,順序在success和error之後
jquery版本
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery版本</title>
</head>
<body>
<h2>請點擊並查看控制台</h2>
<br>
<button data-url="/api/testajax/success">成功</button>
<button data-url="/api/testajax/404">404</button>
<button data-url="/api/testajax/500">500</button>
<button data-url="/api/testajax/parseError">解析json錯誤</button>
<button data-url="/api/testajax/empty">傳回值空</button>
<button data-url="/api/testajax/timeout">逾時</button>
<script type="text/javascript" src="/static/jquery.js"></script>
<script type="text/javascript">
function send(url){
$.ajax({
url: url,
data: {
r: new Date().getTime()
},
dataType: 'json',
error: function(a,b){
console.log(a,b, 'error');
},
success: function(a){
console.log(a, 'success');
},
complete: function(a){
console.log(a, 'complete');
},
timeout: 3000
});
}
$('button').on('click', function(){
send($(this).data('url'));
});
</script>
</body>
</html>
zepto版本
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>zepto版本</title>
</head>
<body>
<h2>請點擊並查看控制台</h2>
<br>
<button data-url="/api/testajax/success">成功</button>
<button data-url="/api/testajax/404">404</button>
<button data-url="/api/testajax/500">500</button>
<button data-url="/api/testajax/parseError">解析json錯誤</button>
<button data-url="/api/testajax/empty">傳回值空</button>
<button data-url="/api/testajax/timeout">逾時</button>
<script type="text/javascript" src="/static/zepto.js"></script>
<script type="text/javascript">
function send(url){
$.ajax({
url: url,
data: {
r: new Date().getTime()
},
dataType: 'json',
error: function(a,b){
console.log(a,b, 'error');
},
success: function(a){
console.log(a, 'success');
},
complete: function(a){
console.log(a, 'complete');
},
timeout: 3000
});
}
$('button').on('click', function(){
send($(this).data('url'));
});
</script>
</body>
</html>