jQuery For Loop与Post无法正确计数

时间:2010-10-08 23:18:00

标签: jquery arrays post loops alert

所以,我有以下代码行,它们在每个循环中执行for循环和主题12。 如果我在帖子之前提醒,它会按照您的预期警告数字(72,60,48,36,24)。 但是,随着帖子内的警报,它会提醒数字12次。 知道为什么会这样吗?知道12号来自何处?

function loadEstimates(option){
    for(term_length=72; term_length>=24; term_length-=12){
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};
        $.post('../includes/process.php', post_options, function(response, status){
            alert(term_length);
        });
    }
}

问题的第二部分是,我想按顺序输出这些,我偶尔会注意到由于服务器响应时间的原因,帖子将输出一些随机的东西,如36,48,24,72,60。如何将帖子中的“响应”放入数组中,或者让我在显示之前对其进行排序?

谢谢!

///////编辑//////// 好的,所以我采取了一些ChessWhiz的建议,并使用了一个数组并提出了。

function loadEstimates(option){
    var term_length = new Array('72','60','48','36','24');
    var term_length_output = new Array(5);
    $.each(term_length, function(index, t_length){
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:t_length};
        $.post('../includes/process_instantquote.php', post_options, function(response, status){
            term_length_output[t_length] = response;
        });
    });

    alert(term_length_output);
}

如果我决定在term_length中使用不能被12整除的数字,这也解决了我未来的潜在难题。 但是,term_length_output仍然是空白的。知道我做错了什么吗?


** 最终编辑 * ****

这是我最终使用的代码。它完全符合我的需要。它可能不是最正确的100%方式,但它确实有效。

非常感谢你的回答和帮助!!!

function loadPriceEstimates(option){
    $('#package-term-options table tbody').append('<tr><td style="text-align:center;" colspan="5"><img src="images/ajax-loader-small.gif" alt="Loading..." class="small-loading"/></td></tr>').show();
    var term_length = new Array('72','60','48','36','24');
    var term_length_output = new Array();
    var count = 0;
    $.each(term_length, function(index, t_length){
        var post_options = {loadPriceEstimates: 'true', coverage_option:option, term_length:t_length};
        $.post('../includes/process_instantquote.php', post_options, function(response, status){
            if(status == 'success'){
                term_length_output[t_length] = response;
                count++;
                if(count == 5){
                    term_length_output.sort();
                    term_length_output.reverse();
                    $('#package-term-options table tbody').html('');
                    $.each(term_length_output, function(index, value){
                        $('#package-term-options table tbody').append(value);
                    });
                }
            }
        });
    });
}

3 个答案:

答案 0 :(得分:2)

我认为这是因为for循环体不是回调函数闭包的作用域,作用域是容器函数。

试试这个:

function loadEstimates(option){
    for(term_length=72; term_length>=24; term_length-=12){
        postProcess(term_length);
    }
}

function postProcess(term_length) {
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};
        $.post('../includes/process.php', post_options, function(response, status){
            alert(term_length);
        });
}

有关详细信息,请参阅:

答案 1 :(得分:1)

使用向后计数24的索引变量容易出错。相反,使用普通索引,然后计算term_length。接下来,您可以使用数组来存储结果。但是,如果回调尚未完成运行,则阵列将不会保留所有结果。最后,您需要复制循环变量以转义闭包。例如:

function loadEstimates(option) {
    for(i = 0; i < 5; i++) {
        var resultsIndex = i;
        var term_length = 72 - (i * 12);
        var post_options = {loadEstimates: 'true', coverage_option:option, term_length:term_length};

        $.post('../includes/process.php', post_options, function(response, status){
            results[resultsIndex] = response;
        });
    }
}

然后,您的结果将在results数组中很好地对齐。由闭合引起的[12,12,12,12,12]副作用基本上是因为每次输出term_length的最后一个值,即24-12 = 12 ,由于for循环修改它并且函数关闭它的方式。

答案 2 :(得分:1)

问题与for的工作方式有关:它在整个生命周期中使用相同的变量(而不是实例化新的变量),这意味着每个回调都绑定到$.post()回调时间。 AJAX调用是异步的,直到你的循环完成并且term_length已经降到12之后才会调用该回调。

有关JavaScript之外的一般问题的讨论,请参阅"Python's lambda is broken!"

然后,解决方案是以某种方式让JavaScript在每次迭代时实例化一个新变量,这样它就不会在循环期间从你的下面改变。一种方法是通过一个函数传递它。请参阅Nicolas Bottarini对代码的回答。