web-dev-qa-db-ja.com

jQuery ajax呼び出しを繰り返す

10秒ごとにjQuery ajax呼び出しを繰り返す方法は?

$(document).ready(function() {
    $.ajax({    
        type: "GET",    
        url: "newstitle.php",   
        data: "user=success",    
        success: function(msg) {
            $(msg).appendTo("#edix");    
        }  
    });

$ .ajaxを関数でラップし、setIntervalで関数を呼び出そうとしました

$(document).ready(function() {
    function ajaxd() { 
        $.ajax({
            type: "GET",
            url: "newstitle.php",
            data: "user=success",
            success: function(msg) {
                $(msg).appendTo("#edix");
            }
        });
    }
    setInterval("ajaxd()",10000);
});

しかし、それは「ajaxdが定義されていない」と言っています

24
randomwebdev

メソッドをreadyメソッドの内部に配置しないでください。そうしないと、外部ではなくonly be =で使用できます。

$(document).ready(function() {
    setInterval(ajaxd, 10000);
});

function ajaxd() { 
  $.ajax({
   type: "GET",
   url: "newstitles.php",
   data: "user=success",
   success: function(msg){
     $(msg).appendTo("#edix");
   }
 });
}
49
balexandre

より良いアプローチはsetTimeoutを使用することです。そのため、前のリクエストが完了したときにのみリクエストを行います。

どうすべきか

なんらかの理由(サーバーの誤動作、ネットワークエラーなど)で要求が定義された時間より長くかかると想像してください。多くの同時リクエストが発生しますが、これは良いことではありません。また、時差を10秒から1秒に短縮するとしたらどうでしょうか。

_$(function() {
  var storiesInterval = 10 * 1000;
  var fetchNews = function() {
    console.log('Sending AJAX request...');
    $.ajax({
      type: "GET",
      url: "newstitles.php",
      data: {
        user: 'success',
        some: ['other', 'data']
      }
    }).done(function(msg) {
      $(msg).appendTo("#edix");
      console.log('success');
    }).fail(function() {
      console.log('error');
    }).always(function() {
      // Schedule the next request after this one completes,
      // even after error
      console.log('Waiting ' + (storiesInterval / 1000) + ' seconds');
      setTimeout(fetchNews, storiesInterval);
    });
  }
  
  // Fetch news immediately, then every 10 seconds AFTER previous request finishes
  fetchNews();
});_
_<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>_

6年後のことです。しかし、それでも他の人にとっては価値があると思いました。

OPのコードが機能しないのはなぜですか?

ajaxd()関数呼び出しを文字列としてsetIntervalに渡したため、コードが主に機能しなかったことは注目に値します。 setIntervalは関数がグローバルに定義されているであると想定しているため、これは非推奨です。私の例のように、関数への参照を使用する必要があります。そうすれば、関数がどこで定義されているか、それが匿名であるかどうかは関係ありません。

10
Wiktor Bednarz
$(document).ready(function() {

setInterval(function() { 
  $.ajax({
   type: "GET",
   url: "newstitle.php",
   data: "user=success",
   success: function(msg){
     $(msg).appendTo("#edix");
   }
 });
}, 10000);

});
8
Curt