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 に答える