javascript - 在没有警报的情况下处理时未初始化的变量

标签 javascript jquery

我正在尝试用 Javascript/jQuery/PHP 构建一个日志阅读器,在 ingrid 表中显示文本文件的内容。

Javascript部分具有以下功能:

<script type="text/javascript">
$(function() {
  // Count number of lines in the log file
  var $anzahlElemente=0;
  $.countLines = function() {
    $.get("../log.log", function(text) {
      var $lines = text.split(/\r|\r\n|\n/);
      $anzahlElemente = $lines.length-1;
    });
  };

  // Generate table
  $.showTable = function() {
    $("#table1").ingrid({
      url: 'ingrid.php',
      height: 625,
      initialLoad: true,
      rowClasses: ['grid-row-style1','grid-row-style1','grid-row-style2','grid-row-style1','grid-row-style1','grid-row-style3'],
      sorting: false,
      paging: true,
      totalRecords: $anzahlElemente
    });
  }

$.countLines();
$.showTable();
});
</script>

现在的问题是函数处理的顺序或顺序似乎有问题。两个函数完成后,$anzahlElemente还是0。需要$anzahlElemente来显示表格分页功能。

奇怪的是,当我尝试以下操作时,第一个警报显示“0”,第二个警报显示正确的行数。如果没有警报,元素的数量和分页功能就会丢失。但有了它们,一切正常,除此之外我不想收到这些警报。 ;)

$.countLines();
alert($anzahlElemente);
alert($anzahlElemente);
$.showTable();

您是否需要所有其他部分,例如 html、php、css 和图像,还是您直接看到我的错误?

编辑:我希望允许附加文件。我没有找到上传选项,所以我这样做了: ingrid.zip

最佳答案

该问题是对涉及异步 I/O 的 javascript 代码如何执行的常见误解。在您的代码中,由于 $.get 是异步的,因此 showTable 实际上是在设置命名变量之前执行的。

您可以将代码更改为

var countLines = function(renderTable) {
    $.get("../log.log", function(text) {
      var $lines = text.split(/\r|\r\n|\n/);
      showTable($lines.length-1)
    });
};
// Generate table
var showTable = function(anzahlElemente) {
    $("#table1").ingrid({
      url: 'ingrid.php',
      height: 625,
      initialLoad: true,
      rowClasses: ['grid-row-style1',
                   'grid-row-style1',
                   'grid-row-style2',
                   'grid-row-style1',
                   'grid-row-style1',
                   'grid-row-style3'],
      sorting: false,
      paging: true,
      totalRecords: anzahlElemente
    });
}

$(function() {
  countLines(showTable);
});

通过这种方式,showTable 只会在 $.get 成功时执行。

详细一点。对 countLines 的调用实际上在对 $.get 的调用之前结束,并且在您的代码中,您将在 $.get 调用执行回调之前执行对 showTable 的调用(匿名函数设置$anzahlElemente。当您插入警报时,您正在更改时间,为对所述回调的调用提供足够的时间来执行。

关于javascript - 在没有警报的情况下处理时未初始化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17464082/

相关文章:

javascript - DTM : _satellite not defined

Javascript 通过 parent ID 选择 child

javascript - 如何使用 jquery 在相邻的 <td></td> 元素中添加/减去值

javascript - 带有引导网格和卡片的 Owl Carousel

Javascript 按位问题

JavaScript,提交时

javascript - 如何将选定时隙数组格式化为格式化字符串

javascript - 无法在单击事件中为输入添加边框颜色

javascript - 我使用 .done() 不正确,没有按预期返回值

javascript - AngularJS ng-repeat 更新稍慢