Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的for循环完成之前,事情发生在它之外(javascript)_Javascript_Loops_For Loop - Fatal编程技术网

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

在我的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

我肯定我以前见过这个,知道答案,但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');
函数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:我认为答案可以解决问题。。。。这只是解释为什么它不起作用。。。。我累了;)你