在我的for循环完成之前,事情发生在它之外(javascript)
我肯定我以前见过这个,知道答案,但12小时后。。。我的脑子乱七八糟 我有一个for循环,在这个循环中,我试图连接到一个字符串上,以便在我完成字符串(从而完成一个漂亮的小表格)之后,我希望将该字符串插入到我的html中并向用户显示 然而,函数末尾的东西(在for循环之后)在for循环之前被调用在我的for循环完成之前,事情发生在它之外(javascript),javascript,loops,for-loop,Javascript,Loops,For Loop,我肯定我以前见过这个,知道答案,但12小时后。。。我的脑子乱七八糟 我有一个for循环,在这个循环中,我试图连接到一个字符串上,以便在我完成字符串(从而完成一个漂亮的小表格)之后,我希望将该字符串插入到我的html中并向用户显示 然而,函数末尾的东西(在for循环之后)在for循环之前被调用 function getEntries() { $('#entryTotalsDiv').html('<img src="images/ajax-loader.gif" /> ... retr
function getEntries() {
$('#entryTotalsDiv').html('<img src="images/ajax-loader.gif" /> ... retrieving form totals.');
var entryTotalsTable = "<table id='entryTable' class='display' style='border:1px;'><thead><tr><th>Form Name</th><th>Hash</th><th>Entries</th></tr></thead>" +
"<tbody>"
//Get rows ONE at a time.
var countNumber = 1;
for (var frm = 0; frm < numberOfForms; frm++) {
$.post('ajax/getEntries.aspx',
{
'formNumber': frm
},
function (data) {
entryTotalsTable += "<tr><td>" + data[0].formName + "</td><td>" + data[0].formHash + "</td><td>" + data[0].formEntryCount + "</td></tr>";
//Now go and update the Form Retrieval div -- add 1 to the frm Number
$('#formNamesDiv').html(countNumber + ' of ' + numberOfForms + ' retrieved.');
countNumber++;
});
}
entryTotalsTable += "</tbody></table>";
$('#entriesDiv').html(entryTotalsTable);
//Now bind the table to the DataTables JQ script
$('#entryTable').dataTable();
$('#entryTable').show('slow');
函数getEntries(){
$(“#entryTotalsDiv').html(“…检索表单总计”);
var entryTotalsTable=“Form namehashcentries”+
""
//一次获取一行。
var countNumber=1;
对于(var frm=0;frm
}
如果您注意到了,我想在最后关闭表html,但是在for循环完成之前调用了它,这样就把我的字符串搞乱了
?
entryTotalsTable+=”;
$('#entriesDiv').html(entryTotalsTable);
//现在将表绑定到DataTables JQ脚本
$('#entryTable').dataTable();
$(“#entryTable”).show('slow');
}$.post是异步的,这意味着它将尽可能快地触发循环中的所有请求,然后退出循环。它不会等待响应。当响应返回时,您的行函数将被调用。。。但到那时,所有的邮件都已经发送出去了 在这里看到这个问题的答案。。。
您需要将$.post更改为$.ajax$。post是异步的,这意味着它将尽可能快地触发循环中的所有请求,然后退出循环。它不会等待响应。当响应返回时,您的行函数将被调用。。。但到那时,所有的邮件都已经发送出去了 在这里看到这个问题的答案。。。
您需要将$.post更改为$.ajax解决方案可以是在数组中保存每个响应,并在每个回调中测试当前计数是否等于总计数。比如:
var countNumber = 1,
allData = [];
function runWhenFinished() {
if(countNumber === numberOfForms) {
var entryTotalsTable = "<table id='entryTable' class='display' style='border:1px;'><thead><tr><th>Form Name</th><th>Hash</th><th>Entries</th></tr></thead>" + "<tbody>";
for(var i = 0, l = allData.length; i < l; i++) {
entryTotalsTable += "<tr><td>" + allData[i].formName + "</td><td>" + allData[i].formHash + "</td><td>" + allData[i].formEntryCount + "</td></tr>";
}
entryTotalsTable += "</tbody></table>";
$('#entriesDiv').html(entryTotalsTable);
//Now bind the table to the DataTables JQ script
$('#entryTable').dataTable();
$('#entryTable').show('slow');
}
}
for(var frm = 0; frm < numberOfForms; frm++) {
(function(frm) {
$.post('ajax/getEntries.aspx',{'formNumber': frm}, function (data) {
allData[frm] = data[0];
countNumber++;
$('#formNamesDiv').html(countNumber + ' of ' + numberOfForms + ' retrieved.');
runWhenFinished();
});
}(frm));
}
var countNumber=1,
所有数据=[];
函数runWhenFinished(){
if(countNumber==numberoforms){
var entryTotalsTable=“Form namehashcentries”+”;
对于(变量i=0,l=allData.length;i
我相信这仍然可以改进,但你明白了
如果你真的提出了70个请求,那么你可能还是要重新考虑你的策略。70个同时请求太多了
例如,您可以提出一个请求,并证明应检索/更新/的最小和最大数量。解决方案可以是将每个响应保存在一个数组中,并在每个回调中测试当前计数是否等于总计数。比如:
var countNumber = 1,
allData = [];
function runWhenFinished() {
if(countNumber === numberOfForms) {
var entryTotalsTable = "<table id='entryTable' class='display' style='border:1px;'><thead><tr><th>Form Name</th><th>Hash</th><th>Entries</th></tr></thead>" + "<tbody>";
for(var i = 0, l = allData.length; i < l; i++) {
entryTotalsTable += "<tr><td>" + allData[i].formName + "</td><td>" + allData[i].formHash + "</td><td>" + allData[i].formEntryCount + "</td></tr>";
}
entryTotalsTable += "</tbody></table>";
$('#entriesDiv').html(entryTotalsTable);
//Now bind the table to the DataTables JQ script
$('#entryTable').dataTable();
$('#entryTable').show('slow');
}
}
for(var frm = 0; frm < numberOfForms; frm++) {
(function(frm) {
$.post('ajax/getEntries.aspx',{'formNumber': frm}, function (data) {
allData[frm] = data[0];
countNumber++;
$('#formNamesDiv').html(countNumber + ' of ' + numberOfForms + ' retrieved.');
runWhenFinished();
});
}(frm));
}
var countNumber=1,
所有数据=[];
函数runWhenFinished(){
if(countNumber==numberoforms){
var entryTotalsTable=“Form namehashcentries”+”;
对于(变量i=0,l=allData.length;i
我相信这仍然可以改进,但你明白了
如果你真的提出了70个请求,那么你可能还是要重新考虑你的策略。70个同时请求太多了
例如,您可以提出一个请求,并证明应检索/更新的请求的最小和最大数量/无论该方法在做什么。您是在循环中提出Ajax请求。Ajax是异步的,因此循环后的代码在Ajax回调执行之前执行。numberOfForms是在哪里定义的?还是我的脑子也乱七八糟的???@Felix:这应该是个答案另一个注意事项:我认为您甚至不能依赖这样一个事实,即回调是按照循环的顺序调用的。早期查询的响应可能早于后期查询的响应。@cHao:我认为答案可以解决问题。。。。这只是解释为什么它不起作用。。。。我累了;)你