2

用户填写表单并单击提交,然后调用 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)
}
4

1 回答 1

1

如果我对您的理解正确,那么问题就在这里:

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

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

if (data.indexOf("END OF FILE") != -1) {
    clearInterval(myTimer);
}
于 2013-06-28T14:48:29.843 回答