所以,我有以下代码行,它们在每个循环中执行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);
});
}
}
});
});
}
答案 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对代码的回答。