【问题标题】:jQuery setInterval preventing async ajax callsjQuery setInterval 防止异步 ajax 调用
【发布时间】:2013-06-28 13:21:52
【问题描述】:

用户填写表单并单击提交,然后调用 utilsSubmit 函数。该函数设置一些变量,然后调用另一个开始读取文件的函数。如果文件不存在,它只会输出“连接到设备...”。一旦文件存在,它应该将输出放入一个 div 中。

在循环的同时,我通过 ajax 运行另一个脚本来写入一个文件(readFile 脚本正在寻找的同一个文件。)

问题是,直到 utilsSubmit 中的 ajax 调用完成后才会调用 readFile 函数。如果我删除 setInterval“包装器”并只运行 readFile 函数,它将起作用,但是,我需要它继续寻找该文件,直到我告诉它停止(死人或文件中的某些字符串。)

我需要 readFile 函数立即触发并将数据输出到浏览器。

function utilsSubmit(x){
    var stuff = x;
    file = "/path/to/file";
    deadman = 1;

    myTimer = setInterval(function() {
        readFile(file);
    }, 300);

    $.ajax({
      type: "POST",
      url: "write_file.php",
      data: {
        "file": file
      },
      success: function(data) {
        $("#networkUtils").html(data);
      }
    });
};

function readFile(x) {
    var file = x;
    $.ajax({
      type: "POST",
      url: "read_file.php",
      data: {
        "file": file
      },
    success: function(data) {
        $("#networkUtils").html(data);
        if (data.indexOf("END OF FILE")) {
            clearInterval(myTimer);
        }
     }
    });
    if (deadman >= 1000) {
        clearInterval(myTimer);
    }
    deadman++;
}

编辑 - 按照建议尝试 setTimout
然而,现在的问题是我无法退出循环。如果我尝试将 setTimeout 结果设置为 var,然后根据某些逻辑对该 var 进行 clearTimeout,则该函数仅在第一次运行(它不会循环。)

更新代码:

function utilsSubmit(x){
    var name = x;
    file = "/path/to/file";
    deadman = 1;

    var myTimer;
    readFile(file);

    // AJAX Call to Write to file...
};

function readFile(x) {
    var file = x;
    $.ajax({
      type: "POST",
      url: "read_file.php",
      data: {
        "file": file
      },
    success: function(data) {
        $("#networkUtils").html(data);
        if (data.indexOf("END OF FILE")) {
            clearInterval(myTimer);
        }
     }
    });
    if (deadman >= 1000) {
        clearInterval(myTimer);
    }
    deadman++;
    myTimer = setTimeout(function(){
        readFile(file);
    }, 300)
}

【问题讨论】:

  • 如果你只是简单地调用函数然后在里面使用setTimeout再次调用它自己呢?
  • 好点。实际上,在发布此内容并确定setTimeout 路由可能是更好的方法后,我做了更多阅读。现在试试。
  • 试过setTimeout。它有效,但我在退出时遇到问题。用代码等更新了问题描述。

标签: php jquery ajax


【解决方案1】:

如果我的理解正确,问题就出在此处:

if (data.indexOf("END OF FILE")) {
    clearInterval(myTimer);
}

indexOf 如果找不到字符串,则返回-1-1 是“真实的”。 clearInterval 不会运行的唯一一次是indexOf 返回0,这意味着“文件结束”是第一个字符。我假设你想在它在任何地方找到“END OF FILE”时退出,在这种情况下应该是这样的:

if (data.indexOf("END OF FILE") != -1) {
    clearInterval(myTimer);
}

【讨论】:

  • 就是这样!!谢谢詹姆斯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2012-05-04
  • 2011-10-13
相关资源
最近更新 更多