我想将“$ .push”的“.push”结果放入数组中。
我已尝试过以下代码,但似乎cats.push(data);
在$.post
函数内无效,我可以确认alert(data);
数据变量不为空但在结尾“cats”数组是空的
$('[id^="mul-"]').click(function () {
cats = [];
$(this).toggleClass('selected');
$(".selected").each(function(){
$.post( "/index.php?do=getcatname&id=" + this.id.slice().replace(/mul-/,''), function( data ) {
cats.push(data);
alert(data);
});
});
ms = cats.join(",");
alert(ms);
});
答案 0 :(得分:4)
AJAX中的第一个字母A
代表异步。这意味着$.post
方法会立即返回 ,并且可能会在稍后调用成功回调。在这里,您似乎正在执行多个AJAX请求,并且在每个AJAX请求的成功回调中,您似乎在向数组添加一些元素。因此,直到最后一个AJAX请求执行完毕,您才能使用此数组的结果。
您可以使用jQuery 1.5中引入的延迟执行来聚合多个AJAX调用的结果:
$('[id^="mul-"]').click(function () {
$(this).toggleClass('selected');
// get an array of the ids that will be used for each AJAX call
var ids = $(".selected").map(function() {
return this.id.slice().replace(/mul-/,'');
});
// declare the variable that will hold the result
var categories = [];
var ajaxCall = function(i) {
return $.ajax({
url: '/index.php',
type: 'POST',
data: { do: 'getcatname', id: i }
}).done(function (res) {
categories.push(res);
});
};
$.when.apply($, ids.map(function(i) {
return ajaxCall(i);
})).then(function() {
// Here you could use the categories array:
var result = categories.join(', ');
alert(result);
});
});
这就是说你应该记住,在性能方面制作多个小型AJAX请求比使用单个更大的AJAX请求更糟糕。这意味着您应该修改index.php
脚本,以便它能够将ids
列表作为参数(而不是单个ID)并返回相应类别的列表。然后在你的.click处理程序中,你将构建这个id列表并向你的服务器发送一个AJAX请求。这基本上是将逻辑推送到您的服务器,这将比您当前的架构方法更快。
以下是代码的改进版本可能如下所示:
$('[id^="mul-"]').click(function () {
$(this).toggleClass('selected');
// get an array of the ids that will be used for each AJAX call
var ids = $(".selected").map(function() {
return this.id.slice().replace(/mul-/,'');
});
$.ajax({
url: '/index.php',
type: 'POST',
data: { do: 'getcatnames', ids: ids },
success: function(categoryNames) {
alert(categoryNames.join(', '));
}
});
});
请注意我们如何将整个id列表发送到您的sevrer端脚本,该脚本将负责将相应类别名称列表作为JSON数组返回:['cat 1', 'cat 2', 'cat 3', ...]
。