$.ajax dataType設置為json 回調函數不執行


請求方式如下:

$.xpost = function (url, data) {
    return $.ajax({
        url: url,
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify(data)
    });
};

在service中調用請求

class Service {
       
        //保存訂單
        saveOrder(order){
            let url = config.rootUrl +'/order/main/saves';
            return $.xpost(url, JSON.stringify(order));
        }

 }

let service = new Service();

在view中調用service里面的savaOrder方法

            service.saveOrder(order).then((result)=>{
                if(result.status == 1){
                    $("#cashPayBox").modal('hide');
                    if(order.status == 12){
                        //支付完成,當前單據完結

                        //流水號遞增1
                        this.baseInfo.serialNo += 1;
                        $(".cashier").databind(this.baseInfo);

                        //清空面板關於掛起訂單的信息
                        this.page.clearOrderInfo();
                        this.page.order = {};
                        this.page.item = {};
                    }else{
                        service.getOrder(orderNo).then((orderInfo)=>{
                            $.tryInvoke(this.setCurrentOrder,this,orderInfo);
                            //更新支付金額區域顯示金額
                            this.changePayAmount(0.00,amount,payway)
                        });
                    }
                }else{

                }
            });
        

  向服務器發送請求,請求正確返回,狀態是200,沒看到報錯。但是就是不執行后面then里面的回調方法。

查詢jQuery api,看到里面的解釋:

dataType (default: Intelligent Guess (xml, json, script, or html))

Type:  String
從服務器返回你期望的數據類型。 如果沒有指定,jQuery將嘗試通過MIME類型的響應信息來智能判斷(一個XML MIME類型就被識別為XML,在1.4中 JSON將生成一個JavaScript對象,在1.4中 script 將執行該腳本,其他任何類型會返回一個字符串)。 可用的類型(以及結果作為第一個參數傳遞給成功回調函數)有:
  • "xml": 返回 XML 文檔,可以通過 jQuery 處理。
  • "html": 返回純文本 HTML 文本;包含的script標簽會在插入DOM時執行。
  • "script": 把響應的結果當作 JavaScript 執行,並將其當作純文本返回。默認情況下會通過在URL中附加查詢字符串變量 ,_=[TIMESTAMP], 禁用緩存結果,除非設置了cache參數為true注意: 在遠程請求時(不在同一個域下),所有POST請求都將轉為GET請求。(愚人碼頭注:因為將使用DOM的script標簽來加載)
  • "json":把響應的結果當作 JSON 執行,並返回一個JavaScript對象。跨域"json" 請求轉換為"jsonp",除非該請求在其請求選項中設置了jsonp:false。JSON 數據以嚴格的方式解析; 任何畸形的JSON將被拒絕,並且拋出解析錯誤信息。在jQuery1.9中,一個空響應也將被拒絕;服務器應該返回null或 {}響應代替。(見json.org的更多信息,正確的JSON格式。)
  • "jsonp": 以 JSONP 的方式載入 JSON 數據塊。會自動在所請求的URL最后添加"?callback=?"。默認情況下會通過在URL中附加查詢字符串變量 ,_=[TIMESTAMP], 禁用緩存結果,除非設置了cache參數為true
  • "text": 返回純文本字符串。

我的ajax請求里面的dataType設置的是json,查看后台返回的是一個String,估計問題應該出在這里。把后台返回改成了Map鍵值對。再一試,發現可以進入回調函數了。

 

Data Types(數據類型)

$.ajax()調用不同類型的響應,被傳遞到成功處理函數之前,會經過不同種類的預處理。 預處理的類型取決於由更加接近默認的Content-Type響應,但可以明確使用dataType選項進行設置。如果提供了dataType選項, 響應的Content-Type頭信息將被忽略。

有效的數據類型是text, html, xml, jsonjsonp,和 script.

如果指定的是text 或 html, 則不會預處理。 這些數據被簡單地傳遞給成功處理函數, 並通過該jqXHR對象的responseText屬性獲得的。

如果指定的是xml, 響應結果作為XMLDocument,在傳遞給成功處理函數之前使用jQuery.parseXML進行解析。 XML文檔是可以通過該jqXHR對象的responseXML屬性獲得的。

如果指定的是json,響應結果作為一個對象,在傳遞給成功處理函數之前使用jQuery.parseJSON進行解析。 解析后的JSON對象可以通過該jqXHR對象的responseJSON屬性獲得的。

 

查看jQuery.parseJSON( json )的解釋:

  

傳入格式有誤的 JSON 字符串可能導致拋出異常。例如,下面這些無效的 JSON 字符串:

  • {test: 1} (test 沒有使用雙引號包裹).
  • {'test': 1} ('test' 用了單引號而不是雙引號包裹).
  • "{test: 1}" (test 沒有使用雙引號包裹).
  • "{'test': 1}" ('test' 用了單引號而不是雙引號包裹).
  • "'test'" ('test' 用單引號代替雙引號).
  • ".1" (number 必須以數字開頭; "0.1" 將是有效的).
  • "undefined" (undefined 不能表示一個 JSON 字符串; 然而null,可以).
  • "NaN" (NaN 不能表示一個 JSON 字符串; 用Infinity直接表示無限也是不允許的).

上面提到返回是一個字符串時會導致拋出異常,奇怪的是我調試的時候並沒有拋出異常。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM