jquery ajax非同步請求回調的詳解

來源:互聯網
上載者:User


是指在寫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>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.