簡體   English   中英

盡管200 OK,仍處理原始JavaScript返回到.ajax錯誤函數

[英]Handling raw JavaScript being returned to .ajax error function despite 200 OK

我正在對無法控制的產品進行以下jQuery.ajax()調用:

$.ajax({
    type: "POST",
    url: "/WfWsR",
    data: { method: 'getInfo',
        nodeID: nodeID
    },
    dataType: "text",
    success: function(data, response, replyxhr){
        return data;
    },
    error: function(replyxhr, response){
        console.log(response);
        console.log(replyxhr);
        return response;
    }
});

POST以200 OK成功,但沒有轉到成功函數,而是以錯誤形式結束,將響應變量設置為“錯誤”,將replyxhr變量設置為Object {readyState = 0,status = 0,statusText =“錯誤”}。

通過郵遞員手動嘗試POST會產生以下結果:

new Array(
  new Array(
    new Array(
      "15", "1", ""
    )
  ), 
  new Array(
    new Array(
      "1", "3757", "3757", "user", "2013-01-22 15:09:04.354"
    )
  ), 
  new Array(
  ), 
  new Array(
    "3762", "ABCD", "test Purge Documents", "50", "purge Documents", "Administrator", "2013-01-22 15:07:57.065"
  ), "13d886ddf90"
)

有很多JavaScript; 從技術上講,我只需要這些陣列中的任何一個。 我認為它在jQuery中不起作用的原因是,這種返回可能無效,尤其是考慮到dataType:“ text”。 但是我也不能使用dataType:“ script”; 使用隱式GET而不是POST的網址,所涉及的網址不支持GET。

我還有其他選擇嗎?

我要猜測的是,根據響應的content-type ,您正在告訴Ajax期待text但它還有其他作用。 看來服務器正在提供Javascript,所以如果content-type為text/javascript ,我不會感到驚訝。

我從來沒有處理過,但是如果這是您的問題,文檔確實會說jQuery 1.5及更高版本中有一個解決方案:

多個用空格分隔的值:從jQuery 1.5開始,jQuery可以將dataType從在Content-Type標頭中接收的dataType轉換為所需的dataType。 例如,如果您希望將文本響應視為XML,請對數據類型使用“文本xml”。 您還可以發出JSONP請求,將其接收為文本,並由jQuery解釋為XML:“ jsonp text xml”。 同樣,速記字符串(例如“ jsonp xml”)將首先嘗試從jsonp轉換為xml,然后,嘗試從jsonp轉換為文本,然后從文本轉換為xml。

通過http://api.jquery.com/jQuery.ajax/ (有關數據類型,請參閱文檔)

這意味着您可以使用以下命令: dataType: "script text"將Javascript響應解釋為文本。 當然,您也可以只使用dataType: "script"將其解釋為腳本。

最終寫了我自己的xhr調用(沒有錯誤處理)以允許這樣做。 解決一個可怕問題的好方法。 (兩次對eval()失敗)。

var xhReq = new XMLHttpRequest();
var params = "method=getInfo&nodeID=" + nodeID;

xhReq.open("POST", "/WfWsR", true);
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhReq.onreadystatechange = onPostSubmit;
xhReq.send(params);
var response = eval(xhReq.response);
var stepIDx = response[0][0][0];

return stepIDx;

function onPostSubmit() {
    if (xhReq.readyState==4 || xhReq.readyState=="complete") { 
        if (xhReq.status != 200) {
            alert('BadStatus');
            return;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM