gpt4 book ai didi

javascript - 在完成之前,事情发生在我的 for 循环之外(javascript)

转载 作者:行者123 更新时间:2023-11-28 21:21:41 25 4
gpt4 key购买 nike

我确信我以前见过这个并且知道答案,但 12 小时后......我的思绪完全困惑了。

我有一个for循环,我试图在其中连接到一个字符串,以便在我可以完成该字符串(从而完成一个漂亮的小表)之后,我希望将其插入到我的html中并向用户显示。

但是,函数末尾的内容(在 for 循环之后)在 for 循环执行之前被调用......

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');

}

如果你注意到了,我想在最后关闭 Table html,但是在我的 for 循环完成之前会调用它,从而搞砸了我的字符串......

entryTotalsTable += "</tbody></table>";
$('#entriesDiv').html(entryTotalsTable);
//Now bind the table to the DataTables JQ script
$('#entryTable').dataTable();
$('#entryTable').show('slow');

}

最佳答案

解决方案可能是将每个响应保存在数组中,并在每个回调中测试当前计数是否等于总计数。像这样的东西:

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));
}

我确信这仍然可以改进,但你明白了。

<小时/>

如果您确实提出了 70 个请求,那么您可能无论如何都需要重新考虑您的策略。 70 个同时请求已经很多了。

例如您可以发出一个请求并证明应该检索/更新/无论该方法正在做什么的最小和最大数量。

关于javascript - 在完成之前,事情发生在我的 for 循环之外(javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com