Can';t在jQuery ajax调用之后,将Response.d的值复制到局部变量

Can';t在jQuery ajax调用之后,将Response.d的值复制到局部变量,jquery,ajax,Jquery,Ajax,我正在调用代码隐藏中的方法。一旦得到数据,我就无法将数据复制到局部变量 我已经创建了一个局部变量。我已经尝试在两个地方记录Ajax调用的结果。首先是内部成功回调方法,其次是外部成功回调方法 在success方法中,我得到了类似于[object,object,object]的东西。然而,在外部,我得到的只是一个空数组[] 为什么我不能将响应复制到局部变量 感谢您的帮助您的成功回调签名错误,您不需要解析JSON。试试这个: var rowArray=[]; $.ajax({ type: "

我正在调用代码隐藏中的方法。一旦得到数据,我就无法将数据复制到局部变量

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

在success方法中,我得到了类似于[object,object,object]的东西。然而,在外部,我得到的只是一个空数组[]

为什么我不能将响应复制到局部变量


感谢您的帮助

您的
成功
回调签名错误,您不需要解析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")
    }
});
另外,正如在a中指出的,调用中没有
失败
回调。正确的名称是
error
,并具有上面显示的签名。我在
error
函数中添加了一条简单的错误消息,但是您可以使用更复杂的消息,如中的示例。

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

在它内部,由于您指定了“json”作为响应中预期的数据类型,jQuery将自动将“response”解析为json,因此它将自动成为一个可用的对象。没有理由再次解析它。在任何情况下,JSON.parse方法都需要字符串,而不是对象,因此这样的调用都不会成功。看

还值得指出的是,您的错误处理是不正确的,以供将来参考。jQueryAjax上下文中没有“失败”这样的回调。正确的回调是“error”,它的第一个参数是jqXHR对象,这意味着
response.d
将不存在于该上下文中<代码>响应。不过,响应是应该的。有关完整文档,请参阅。如果调试将来无法成功的调用,这将对您有所帮助

因此,总体而言,值得将代码更改为以下内容:

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));
  }
});
您的最后一个console.log(rowArray)//此日志[]在ajax调用终止之前执行。 如果需要执行同步ajax调用,只需使用:

$.ajax({
        type: "POST",
        url: "Default.aspx/GetData,
        async: false,
        ......
async:false将发挥神奇的作用:)


…但我强烈建议不要使用此选项,因为这是一种不好的做法。

值得指出的是,没有“失败”这样的回调。正确的回调是“error”,它的第一个参数是jqXHR对象,这意味着
response.d
将不存在于该上下文中<代码>响应。尽管响应很可能。如果调试调用失败,这将有助于OP。我还认为,对于“success”回调中的第三个参数,“errorshown”并不是一个特别好的名称。请求成功,因此未引发任何错误。返回的实际对象也是一个jqXHR对象,因此最好将其命名为jqXHR对象。谢谢您的更正。错误,而不是失败。另外,我试着调试,并且能够亲身体验你刚才所说的。执行没有等到ajax完成,而是进入下一行。后来,它又回到了
$.ajax函数中。太神了请注意,
$.ajax
是异步的,因此在
success
函数之外的第二个控制台日志记录变量的初始值,因为
$.ajax
调用尚未完成。的可能重复项不会这样做。这真是糟糕的做法。仔细阅读。
$.ajax({
        type: "POST",
        url: "Default.aspx/GetData,
        async: false,
        ......