2017-02-20 198 views
0

我正在處理JavaScript中的以下Ajax代碼,我試圖在URL無法正確加載JSON時彈出對話框,原因可能是已過期令牌或不正確的標記,無論如何,我期待代碼出現錯誤或失敗,但不會發生。當URL可以成功加載JSON時,成功和完整的塊會按預期擊中,但是當URL失敗時沒有被擊中。我曾嘗試使用async: false,並嘗試使用布爾變量weHaveSuccess進行檢查,但是console.log(weHaveSuccess);即使在執行成功/錯誤之前,代碼的最後一行也正在執行,在我看來,它仍然是異步加載的。我想知道爲什麼當來自URL的JSON加載失敗時,錯誤塊未被命中。Ajax無法獲取JSON時出現錯誤或失敗未能獲取JSON

我的代碼

function checkUser(myURL, newAccessToken, weHaveSuccess) { 

    $.ajax({ 

     type: "GET", 

     dataType: "jsonp", 

     async: false, 

     url: myURL + newAccessToken, 

     error: function (XMLHttpRequest, textStatus, errorThrown) { 
      console.log("Status: " + textStatus); 
      console.log("Error: " + errorThrown); 
     }, 

     success: function (data) { 

      console.log("Hello 2 " + JSON.stringify(data)); 

      weHaveSuccess = true; 

      console.log('Message from Success ' + weHaveSuccess); 

     }, 

     complete: function() { 
      console.log('Message from Complete ' + weHaveSuccess); 
     } 

    }).done(function (data) { 
     alert("Success"); 
     console.log(data); 
    }).fail(function (data) { 
     console.log(data); 
     alert("Failed"); 
    }).always(function() { 
     alert("In Always"); 
    }); 

    console.log(weHaveSuccess); 
} 

提前感謝!

+0

你爲什麼要處理「錯誤」和「成功「,但也處理」完成「和失敗」?你只需要實現它的一種方式,而不是兩個。 – ADyson

+1

試過這個,它擊中所有正確的處理程序:https://jsfiddle.net/1rLqcLkb/我得到兩個警報「Failed」和「In Always」,在控制檯中,我得到了「狀態」和「錯誤」行,然後是「失敗」數據對象。 –

+0

最初,我剛剛使用成功/錯誤,因爲它d idn't工作我玩弄完成/失敗。 –

回答

0

AJAX請求是異步的。遠程請求需要時間來做出響應。您將不得不在success函數中編寫後回覆代碼,或者從那裏調用另一個函數,而不是與啓動調用的範圍相同。

我在這裏猜測你的服務器在失敗時返回的結果。 AJAX請求成功意味着只收到一個200 OK響應,而不考慮數據的內容。如果錯誤僅僅是數據的變化,你需要做以下操作之一,以顯示錯誤:

  1. 在服務器上設置故障status code頭,也許是400 Bad Request
  2. success函數中查看您的data以瞭解您期望的任何錯誤響應,並在那裏觸發alert()
0

所有console.log(weHaveSuccess);火災第一首先,因爲$.ajax()是異步的,同時的console.log不那麼阿賈克斯將被觸發並返回的承諾時結束,但瀏覽器將繼續與腳本。 在jQuery的AJAX文檔說:

Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation.

很難沒有看到應對調試,也許你可以添加從網絡或URL的一些信息?

+0

當然....例如,如果'網址:「https://api.id.me/api/public/v2/attributes.json?access_token=」 + 10576c9012b248f782529d408ef49d54'然後被達到既不成功也不是錯誤。謝謝! –

0

怎麼樣,如果你嘗試以下方法: 的jsonp設置添加到您的$.ajax()功能將處理響應和CONSOLE.LOG有回調:

function myCallback(data) { 
    console.log(data); 
} 

$.ajax({ 
    type: "GET", 
    dataType: "jsonp", 
    jsonp: myCallback, 
... 
+0

試了一下,用'網址:「https://api.id.me/api/public/v2/attributes.json?access_toke N =」 + 10576c9012b248f782529d408ef49d54'但回調函數是沒有得到調用。謝謝回覆。 –