在$(document).ready中我在一个函数中创建ajax请求,它返回我添加到数组的json数据。我从该函数返回数组但是当我尝试将返回的数据返回给另一个数组时,我的警报不会显示一个充满值的数组。
function retrieveGroupNames() {
var rows = new Array();
$.ajax({
type: "POST",
url: '@Url.Action("LookUpGroupName", "UserManager")',
dataType: "json",
data: {},
success: function (data) {
for (var i = 0; i < data.length; i++) {
rows[i] = {
data: data[i],
value: data[i].group,
result: data[i].group
}
// alert(data[i].group);
// alert(data[1].group);
} // end of for loop
// alert(rows[1].value);
} // end of success
}); // end of ajax
// alert(rows); data here
return rows;
} // end of function
$(document).ready(function () {
chkSelection();
var rows = [];
rows = retrieveGroupNames();
alert(rows);
});
请帮忙吗?谢谢!
答案 0 :(得分:3)
AJAX是异步的。您无法返回依赖于完成请求的内容。您需要使用回调:
function retrieveGroupNames(callback) {
$.ajax({
type: "POST",
url: '@Url.Action("LookUpGroupName", "UserManager")',
dataType: "json",
data: {},
success: function(data) {
var rows = [];
for(var i = 0; i < data.length; i++) {
rows[i] = {
data: data[i],
value: data[i].group,
result: data[i].group
}
}
callback(rows);
}
});
}
$(document).ready(function() {
chkSelection();
retrieveGroupNames(function(rows) {
alert(rows);
});
});
答案 1 :(得分:1)
除了ThiefMaster答案中提供的回调之外的其他选项是使用$.Deferred
objects。使用延迟可以控制异步处理期间何时以及应该发生什么,例如ajax调用。
function retrieveGroupNames() {
// create a deferred object
var deferred = new $.Deferred();
$.ajax({
...
success: function(data) {
var rows = [];
for(var i = 0; i < data.length; i++) {
rows[i] = {
data: data[i],
value: data[i].group,
result: data[i].group
}
}
// resolve the deferred and pass the rows as data
deferred.resolve(rows);
}
});
// return a promise
return deferred.promise();
}
$(document).ready(function () {
// use the when...then syntax to consume the deferred function
$.when(retrieveGroupNames()).then(function (rows) {
// do whatever you want with rows
});
});
另请注意,$.ajax
已经自行返回了一个承诺,因此您可以在return $.ajax({...});
函数中说retrieveGroupNames
。