在jQuery ajax-call

时间:2017-04-11 14:00:23

标签: jquery ajax

我正在调用代码隐藏中的方法。获得数据后,我无法将数据复制到本地变量。

我创建了一个局部变量。我试过在两个地方调试Ajax调用的结果。首先,在成功回调方法内部,其次在外部。

在成功方法中,我得到像 [object,object,object] 这样的东西。但是,在外面,我只得到一个空数组 []

var rowArray=[];

$.ajax({

     type: "POST",
     url: "Default.aspx/GetData",
     contentType: "application/json; charset=utf-8",
     dataType: "json",
     data: '{ dataId: 1 }',
     success: function (response) {
            rowArray = JSON.parse(response.d);     

            //console.log(rowArray); --> this logs [object, object, object ]
     },
     failure: function (response) {
                alert(response.d);
     }
   });

 //console.log(rowArray); --> this logs []

为什么我无法将响应复制到局部变量?

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您的success回调签名错误,您不需要解析JSON。试试这个:

var rowArray=[];

$.ajax({
    type: "POST",
    url: "Default.aspx/GetData",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: '{ dataId: 1 }',
    success: function (response, textStatus, jqXHR) {
        rowArray = response.d;     
    },
    error: function (jqXHR, textStatus, errorThrown) {
        console.log("Could not get data")
    }
});

此外,正如ADyson中指出的commentjQuery.ajax来电中没有failure回调。正确的名称是error,并且具有上面显示的签名。我在error函数中添加了一条简单的错误消息,但您可以使用更复杂的内容,例如ADyson's answer中的示例。

答案 1 :(得分:-1)

在“success”回调之外,你得到一个空变量,因为ajax调用是异步的,所以你的rowArray记录发生在“success”回调执行之前。

在其中,由于您将“json”指定为响应中预期的数据类型,因此jQuery将自动将“响应”解析为JSON,因此它将自动成为可用对象。没有理由再次解析它。在任何情况下,JSON.parse方法都需要一个字符串,而不是一个对象,所以这样的调用不会成功。见https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

为了将来参考,还值得指出您的错误处理不正确。在jQuery ajax上下文中没有“失败”这样的回调。正确的回调是“错误”,它的第一个参数是jqXHR对象,这意味着在该上下文中不存在response.d。但是response.responseJSON应该。有关完整文档,请参阅https://api.jquery.com/jquery.ajax。如果调试将来不成功的调用,这将对您有所帮助。

总的来说,值得将代码更改为以下内容:

var rowArray=[];

$.ajax({
  type: "POST",
  url: "Default.aspx/GetData",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  data: '{ dataId: 1 }',
  success: function (response) {
    rowArray = response.d;  
  },
  error: function (jqXHR, textStatus, errorThrown ) {
    alert("Ajax Error: " + textStatus + " " + errorThrown);
    console.log(jqXHR.status + " " + JSON.stringify(jqXHR.responseJSON));
  }
});

答案 2 :(得分:-1)

你的最后一个console.log(rowArray)//这个logs []在ajax调用终止之前执行。 如果需要执行同步ajax调用,只需使用:

$.ajax({
        type: "POST",
        url: "Default.aspx/GetData,
        async: false,
        ......

async:false 会做出魔术:)

...但我强烈建议不要使用它,因为这是一种不好的做法。