2015-11-01 62 views
0

我對客戶端jQuery如何通過服務器端PHP處理我的JSON ajax響應有一些不一致。爲什麼有時我需要JSON.parse()我的AJAX響應?

這裏有兩個例子Ajax調用我有:

function checkOrders() { 

    $.ajax({ 
     type: "POST" , 
     url:"/service/index.php" , 
     data: { 
      q: "checkOrders" 
     } , 
     complete: function(result) { 

      // note here the JSON.parse() clause 
      var x = JSON.parse(result.responseText); 

      if (x['unhandled_status']>0) { 

       noty({ 
        text: '<center>There are currently <b>'+x['unhandled_status']+'</b> unhandled Orders.', 
        type: "information", 
        layout: "topRight", 
        modal: false , 
        timeout: 5000 
        } 
       });    

      } 

     } , 

     xhrFields: { 
      withCredentials: true 
     } 
    }); 

} 

注意在上面的例子中,我必須JSON.parse()responseText從我的PHP頁面,以對付它作爲一個對象。它以某種方式將整體PHP響應視爲一個對象,爲了使用它,我必須從該對象中取出responseText,並將其取出。

現在這裏是另一個ajax調用,我有,返回的響應,我可以直接用作json響應 - 意思是,PHP頁面不會返回完整的「對象」,但只返回json和我的ajax調用多少已經知道它是JSON,我並不需要它JSON.parse()

function getUnfiledOrders() { 

$.ajax({ 
    type: "POST" , 
    url:"/service/index.php" , 
    data: { 
     queryType: "getUnfiledOrders" 
    } , 
    success: function(result) { 

     if (result['total_records'] >0) { 
      noty({ 
       text: result['response'], 
       type: "error", 
       modal: false, 
       dismissQueue: true, 
       layout: "topRight", 
       theme: 'defaultTheme' 
      }); 
     } 
    } , 
    xhrFields: { 
     withCredentials: true 
    } 
}); 

} 

在這種情況下,我並不需要JSON.parse()來的responseText爲了治療的響應作爲JSON對象。

兩個PHP腳本響應這個樣子:

header('content-type:application/json'); 
$array = array("total_records"=>3,"response"=>"SUCCESS"); 
echo json_encode($array); 

有人給我介紹的這種不均勻性?

編輯:

我意識到,我在上述各Ajax調用的有兩個不同的回調。一個在complete上,另一個在success上。

當我將它們切換到success時,從我的ajax請求返回的響應被統一處理。

所以我想我現在的問題是:

  • 爲什麼會出現這兩個回調之間的非均勻性?
  • 哪個更好用?

回答

2

我剛剛仔細閱讀了關於$ .ajax()的文檔,其中涵蓋了here

無論如何,簡單的是,completesuccess有不同的變量加載在函數中。

complete返回此:

完整
類型:Function(jqXHR jqXHR,字符串textStatus)

success返回此:

成功
類型:Function(任何數據,字符串textStatus,jqXHR jqXHR)

當我有complete,返回的第一個參數是一個對象所以這就是爲什麼我必須使用:

complete: function(data) { 
var x = JSON.parse(data.responseText); 
} 

作爲我不得不在返回的對象中獲取responseText - 並且它有一個字符串值(不一定要格式化爲JSON)。

success函數返回作爲第一個變量的任何從PHP傳入的內容。在這種情況下,它是一個json_encoded字符串。所以它會返回,並且只要返回而沒有進一步操作,您就可以隨時使用它。

Ta-dah!

另外,請注意, .success()如果服務器響應是200,.complete()總是會得到所謂的不管狀態代碼

0

在你的情況我只想用$.getJSON類似如下:

$.getJSON("api.php", { user: "John", password: "1234" }) 
    .done(function(json) { 
    console.log("JSON object: " + json.friends[ 3 ].name); 
    }) 
    .fail(function(jqxhr, textStatus, error) { 
    console.log("Sorry, the request failed."); 
}); 

這種方式可以確保的答案永遠是一個js對象。

希望這有助於, 塞巴斯蒂安

+0

這將真正有助於解釋爲什麼這是downvoted僅被調用。它確實解決了你的問題,對吧?糾正我,如果我錯了... –

+0

我沒有downvote它.... –

+0

ajax如何調用$ .getJSON調用?也許你可以更好地解釋這一點。它是否總是導致一個對象反對$ .ajax()調用?再一次,我沒有倒下你...... –

1

我以前的響應並不適用於您的問題,但它是你(和大家)可能需要知道的。

關於你的觀點,關於completesuccess - 是的,返回的值是不同的順序。不過,你不需要完整地解析文本。 jqXHR響應具有可直接使用的responseJSON對象。

http://api.jquery.com/jQuery.ajax/#jqXHR

先前響應

你是從一個叫形式checkOrders,使用表單按鈕?

我發現JQuery希望數據在這種情況下是表單編碼的,無論你告訴它你期望JSON。

jquery ajax returns success when directly executed, but returns error when attached to button, even though server response is 200 OK

不知道這是由設計或錯誤。

如果這是您的情況,請嘗試將form標記更改爲div,或將按鈕放在表單外。

相關問題