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