在$ .post函数中使用“push”时清空数组

时间:2014-01-01 21:01:18

标签: jquery

我想将“$ .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);
        });

1 个答案:

答案 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', ...]