我有一个方法发送AJAX
请求并返回一个结果,指示JSON string
代币记录,我试图获得此结果并将其分配给名为{的全局变量{1}}然后在其他函数中重用此全局变量。
我将结果分配给该变量并将其记录到控制台,如下所示:
tokens
问题在于,当我将结果分配给变量然后将其记录到控制台时,它会成功显示结果,但是当我想稍后在其他函数中重用它时,它表明变量仍然是{{1 }}
例如,我想在以下var tokens = null;
function PopulateAllTokens() {
$.ajax({
type: "POST",
url: "NewToken.aspx/PopulateAllTokens",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (result) {
tokens = JSON.parse(result.d);
console.log(tokens);
populateTokensToTable(tokens);
}
});
}
代码中使用它,但它显示该变量为null:
null
只是为了澄清变量和函数都在里面定义:
jQuery
有什么建议吗?
答案 0 :(得分:2)
当您尝试通过AJAX获取值然后尝试在整个$.ajax()
构造之外使用该值时,大多数时候会出现问题。原因是异步调用的响应只能在success
或complete
回调中安全访问 - 无法保证在完成其中任何一个回调之前填充该值。要解决此问题,您可以移动以下代码以从AJAX回调中调用,或者等待回调设置全局变量。
var tokens = null;
function PopulateAllTokens() {
$.ajax({
type: "POST",
url: "NewToken.aspx/PopulateAllTokens",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (result) {
tokens = JSON.parse(result.d);
console.log(tokens);
populateTokensToTable(tokens);
EverythingElseYouWantToRun();
}
});
}
function EverythingElseYouWantToRun() {
// you can do whatever you want with the response here
$("#example").DataTable({
"columns": getTokens(),
"data": tokens
});
}
var tokens = null;
function PopulateAllTokens() {
$.ajax({
type: "POST",
url: "NewToken.aspx/PopulateAllTokens",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (result) {
tokens = JSON.parse(result.d);
console.log(tokens);
populateTokensToTable(tokens);
}
});
}
function RunWhenVariableIsPopulated(variable, callback, timeout) {
if (variable === null) {
setTimeout(function() {
RunWhenVariableIsPopulated(variable, callback, timeout);
}, timeout);
} else {
callback(variable);
}
}
然后你可以打电话:
RunWhenVariableIsPopulated(tokens, function() {
$("#example").DataTable({
"columns": getTokens(),
"data": tokens
});
}, 400 /* or whatever your average round-trip time is*/);
注意:如果您的AJAX响应时间非常长,这会导致浏览器显着挂起,并有效地将异步调用转换为同步调用。希望这有助于您当前的情况!
答案 1 :(得分:1)
function getData(){
return $.ajax({
type: "POST",
url: "NewToken.aspx/PopulateAllTokens",
contentType: "application/json; charset=utf-8",
dataType: "json",
async: false,
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (result) {
tokens = JSON.parse(result.d);
console.log(tokens);
populateTokensToTable(tokens);
}
}).responseText;
}
var res = getData();
上面的代码会将响应存储在变量中,之后您可以解析它并根据需要进行修改。我不确定,但它可以帮到你
答案 2 :(得分:0)
使用$ .parseJSON()方法
$(document).ready()没关系,只有函数调用流,你也可以在外面声明函数并相应地调用它,并且还可以检查变量是否为null
var tokens = null;
function PopulateAllTokens() {
$.ajax({
type: "POST",
url: "NewToken.aspx/PopulateAllTokens",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("Request: " + JSON.stringify(XMLHttpRequest) + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
},
success: function (result) {
tokens = $.parseJSON(result.d);
console.log(tokens);
populateTokensToTable(tokens);
}
});
}
if(tokens)
console.log(tokens);