AJAXリクエストを定期的に起動する方法は?


113
<meta http-equiv="Refresh" Content="5">

このスクリプトは、5秒ごとにページを再読み込みまたは更新します。しかし、私はjQueryとAJAX呼び出しを使用してそれをしたいと思います。出来ますか?

回答:


281

他の人が指摘したように、setIntervalとsetTimeoutがうまくいきます。私は、ポールアイリッシュによるこの優れたビデオから学んだもう少し高度なテクニックを強調したいと思いました。http//paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

繰り返しの間隔よりも時間がかかる可能性のある定期的なタスク(遅い接続でのHTTPリクエストなど)の場合は、を使用しないことをお勧めしますsetInterval()。最初のリクエストが完了していない状態で別のリクエストを開始すると、複数のリクエストが共有リソースを消費して互いに飢餓状態になる可能性があります。この問題を回避するには、最後のリクエストが完了するまで次のリクエストのスケジュールを待機します。

// Use a named immediately-invoked function expression.
(function worker() {
  $.get('ajax/test.html', function(data) {
    // Now that we've completed the request schedule the next one.
    $('.result').html(data);
    setTimeout(worker, 5000);
  });
})();

簡単にするために、スケジューリングには成功コールバックを使用しました。これの欠点は、1つの失敗した要求が更新を停止することです。これを回避するには、代わりに完全なコールバックを使用できます。

(function worker() {
  $.ajax({
    url: 'ajax/test.html', 
    success: function(data) {
      $('.result').html(data);
    },
    complete: function() {
      // Schedule the next request when the current one's complete
      setTimeout(worker, 5000);
    }
  });
})();

3
これは再帰的な関数呼び出しのようなものではありませんか?もしそうなら、それはそれが再帰的であるので、それを長期間にわたって繰り返し実行させても大丈夫ですか?ajaxが正常に実行され続ける限り、無限再帰のケースになる可能性があります
Rahul Dole

1
また、setTimeoutを使用する場合、このコードブロックの外側からこのスレッドを停止する方法はありますか?setIntervalと同様に、clearInterval()を呼び出すだけです。
Rahul Dole

16
@RahulDoleそれは良い質問ですが、再帰的ではありません。ワーカー関数から直接呼び出されないため、スタックは増え続けません。2番目のポイントとして、setTimeout()のドキュメントをチェックアウトすると、clearTimeout()に渡すことができる数値IDが返されることがわかります。
13

7
@RahulDoleを使用している場合は、関数の呼び出しスタックを確認するためにconsole.trace()をいじってください。setTimeout()によって呼び出された関数は非常に短いスタックを持ち、setTimeout()を呼び出した関数は含まれません。
13

1
@Anupalは新しい質問を作成します。
2015年

34

はい、JavaScript setTimeout()メソッドまたはsetInterval()メソッドを使用して、実行するコードを呼び出すことができます。次に、setTimeoutを使用してそれを行う方法を示します。

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

1
setTimeout(executeQuery、5000);だけを使用します。setTimeout( 'executeQuery()'、5000);の代わりに -それは短くて速いです。
rsp

4

setTimeoutまたはを使用できますsetInterval

違いは、setTimeoutは関数を1回だけトリガーするため、再度設定する必要があることです。setIntervalは、停止するように指示しない限り、何度も式をトリガーし続けます


1

私は以下のコードを試しました、

    function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

これは指定された間隔で期待どおりに機能せず、ページが完全に読み込まれず、関数が継続的に呼び出されました。以下のように別の関数でsetTimeout(executeQuery, 5000);外部を呼び出す方が良いですexecuteQuery()

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  updateCall();
}

function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}

$(document).ready(function() {
  executeQuery();
});

これは意図したとおりに機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.