我正在调用代码隐藏中的方法。获得数据后,我无法将数据复制到本地变量。
我创建了一个局部变量。我试过在两个地方调试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 []
为什么我无法将响应复制到局部变量?
感谢您的帮助
答案 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中指出的comment,jQuery.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 会做出魔术:)
...但我强烈建议不要使用它,因为这是一种不好的做法。