关于我的客户端jQuery如何通过服务器端PHP处理我的JSON 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
}
});
}
请注意,在上面的示例中,我必须{PHP}页面JSON.parse()
responseText
才能将其作为对象处理。它以某种方式将整个PHP响应视为一个对象,我必须从该对象中提取responseText
并JSON.parse()
,以便使用它。
现在这是另一个我有的ajax调用,其中返回的响应,我可以直接用作json响应 - 意思是,不知何故,PHP页面不会返回一个完整的&#34;对象&#34;但只返回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请求返回的响应被统一处理。
所以我现在的问题是:
答案 0 :(得分:2)
我刚刚审核了有关{。{3}}的$ .ajax()上的文档。
无论如何,简单的是complete
和success
在函数中加载了不同的变量。
complete
会返回此信息:
完整
键入:Function(jqXHR jqXHR,String textStatus)
success
会返回此信息:
成功
类型:功能(任何数据,字符串textStatus,jqXHR jqXHR)
当我有complete
时,返回的第一个参数是一个对象,这就是我必须使用的原因:
complete: function(data) {
var x = JSON.parse(data.responseText);
}
因为我必须在返回的对象中获取responseText - 并且它具有字符串值(不一定格式化为JSON)。
success
函数作为第一个变量返回从PHP传递的任何内容。在这种情况下,它是一个json_encoded字符串。因此,它会返回,并且您可以在返回时立即使用它,而无需进一步操作。
钽DAH!
另外,请注意
只有在服务器响应为200时才会调用.success()
,无论状态代码如何都会始终调用.complete()
答案 1 :(得分:1)
我之前的回复并不适用于您的问题,尽管您(和所有人)可能需要注意这一点。
关于complete
vs success
的观点 - 是的,返回的值的顺序不同。不过,您还不需要在完成时解析文本。 jqXHR
响应有一个responseJSON
对象,您可以直接使用。
http://api.jquery.com/jQuery.ajax/#jqXHR
以前的回复
您是否使用表单按钮从表单中调用checkOrders
?
我发现JQuery希望在这些情况下对数据进行表单编码,无论你告诉它你期望JSON。
不确定这是设计还是错误。
如果是这种情况,请尝试将form
标记更改为div
,或将按钮放在表单之外。
答案 2 :(得分: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对象。
希望这有帮助, 塞巴斯蒂安