Javascript Ajax.done()没有数据

Javascript Ajax.done()没有数据,javascript,jquery,ajax,get,Javascript,Jquery,Ajax,Get,我使用以下jquery进行ajax调用: $.ajax({ url: "/projects/project/xGetProjectStatus", type: "GET", dataType: "json"}) .done( function(request){ alert(request.responseText); var data = JSON.parse(request.responseText);

我使用以下jquery进行ajax调用:

$.ajax({
    url: "/projects/project/xGetProjectStatus",
    type: "GET",
    dataType: "json"})
    .done( function(request){
            alert(request.responseText);
            var data = JSON.parse(request.responseText);
            if(data.success){
                   //stuff here
            }
})

弹出的警报总是说responseText未定义。我正在“获取”的页面是格式良好的JSON,如果我在控制台中一次运行一个命令,一切正常。有什么问题吗?

当您在
jQuery.ajax
调用中设置
数据类型时,它将作为解析对象返回。因此,
.done
中的
请求
对象实际上是您解析的
json
字符串

如果不希望
jQuery
自动解析JSON,可以从调用中删除数据类型

$.ajax({
    url: "/projects/project/xGetProjectStatus",
    type: "GET"
}).done( function(request){
     alert(request.responseText);
     var data = JSON.parse(request.responseText);
     if(data.success){
         //stuff here
     }
})

您正在响应中查找
responseText
,它不会在那里。您将在
jqXHR
对象本身上找到它(这是传递给
done()
函数的第三个参数,也是整个
$.ajax()调用返回的参数)

因为您有
数据类型:“json”
,所以响应已经是一个json解析的对象

更改此项:

.done( function(request){
     alert(request.responseText);
     var data = JSON.parse(request.responseText);
     if(data.success){
          //stuff here
     }
 })
为此:

.done( function(data){
    if(data.success){
          //stuff here
     }
 })

这是因为done函数的第一个参数不是XHR对象,而是responseText的内容,它已经是一个对象了。jQuery为您处理所有这些,因此无需进行任何手动转换


不管怎样,只要ajax调用成功,就会调用done函数,因此无需重新检查,当返回200以外的响应时,就会调用fail函数。

什么是
console.log(请求)
say?
request
没有
responseText
属性,除非您在服务器端给它一个属性。@KevinB我知道…:)我让OP把它打印出来。。。。所以他会意识到他得到的是他所期望的作为
responseText
但作为解析对象的东西。这告诉jQuery为您调用
JSON.parse
。您的
请求
参数是您的(已解析)对象
if(request.success){}
。删除
数据类型
不会使代码如您所示工作。首先,如果您没有给出
数据类型
,jQuery将尝试根据MIME类型进行猜测。如果URL返回
内容类型:application/json
头,那么jQuery将为您解析它。其次,
responseText
属性位于
jqXHR
对象上,它不是第一个参数。它应该是第三个参数:
.done(function(data,status,jqXHR){})
。如果成功,他不会“重新检查”。他正在检查从AJAX调用中检索到的对象的
success
属性。啊,好吧,就我个人而言,我更喜欢使用状态码来指示操作是否成功,而不是将其作为json对象中的bool传递。返回200如果操作成功,如果出现问题,则返回其他一些40x状态代码。通过将类似信息移动到收割台来减少有效负载大小。