2015-11-01 65 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,或将按钮放在表单外。

相关问题