1

私は次のpoll()機能を持っています:

var pollTimeout = 5000;
(function poll(){
   setTimeout(function(){
      $.ajax({ url: "/ajax/livedata.php", success: function(data){
         if (data[0] == 'success'){
            // i'm doing some irrelevant updating here
         }
         poll();
      }, dataType: "json"});
   }, pollTimeout);
})();

5秒ごとに実行されており、すべて正常に動作しています。

ただし、この機能を手動で実行するにはどうすればよいですか? たとえば、ここで実行する必要があります。

$("#status-update-form textarea").keyup(function(e){
   if (e.keyCode == '13'){
      var status = $(this).val();
      $.get("/ajax/update-status.php", { 'status' : status },
         function(data){
            $("#status-update-form textarea").val('').blur();
            // <-- I need to execute the poll here, so that
            // the status is updated immediatelly after it's
            // submitted, not when the poll fires seconds later
         },'json'
      );
   }
});

どうすればこれを行うことができますか?poll() を起動しようとすると、関数が存在しないと表示されます。

4

3 に答える 3

1

投票を通常の関数に変換する

var pollTimeout = 5000;

function poll(timeout){
   return setTimeout(function(){
      $.ajax({ url: "/ajax/livedata.php", success: function(data){
         if (data[0] == 'success'){
            // i'm doing some irrelevant updating here
         }
         poll();
      }, dataType: "json"});
   }, timeout);
}


$("#status-update-form textarea").keyup(function(e){
   if (e.keyCode == '13'){
      var status = $(this).val();
      $.get("/ajax/update-status.php", { 'status' : status },
         function(data){
            $("#status-update-form textarea").val('').blur();
            poll(0);
         },'json'
      );
   }
});
于 2012-12-02T05:08:33.643 に答える
0

setTimeout()この場合、関数では使用しません。以下のこのコードは、呼び出しのたびにajaxリクエストが強制終了されるようにしますpoll()(開始時に1回、5秒ごと、およびすべてのキーアップイベント呼び出し)

var timeout;
var pollTimeout = 5000;
var ajaxCall;
function poll(){
      if (null != ajaxCall) {
         ajaxCall.abort();
      }
      ajaxCall = $.ajax({ url: "/ajax/livedata.php", success: function(data){
         if (data[0] == 'success'){
            // i'm doing some irrelevant updating here
         }
         poll();
      }, dataType: "json"});
}
poll();
timeout = setTimeout(function(){
    poll();
}, pollTimeout);
$("#status-update-form textarea").keyup(function(e){
   if (e.keyCode == '13'){
      var status = $(this).val();
      $.get("/ajax/update-status.php", { 'status' : status },
         function(data){
            $("#status-update-form textarea").val('').blur();
            poll();
         },'json'
      );
   }
});
于 2012-12-07T01:21:45.770 に答える
0

実際に呼び出す関数からタイムアウト コードを分割し、手動または自動で呼び出すことができます。

var pollTimeoutDelay = 5000;
var pollTimeout = null;
function pollNow(){
  if (pollTimeout !== null);
    clearTimeout(pollTimeout);
    pollTimeout = null;
  }
  // do what you do, then in the callback:
  timeout = setTimeout(pollNow, pollTimeoutDelay); 
}

その後、いつでも pollNow() を呼び出すことができます。それが実行され、タイムアウトが再度設定されます。

  • このメソッドは、グローバル スコープで 3 つの変数を使用します。これが大規模なアプリケーションである場合は、もう少しリファクタリングする価値があるかもしれません。
于 2012-12-02T07:03:05.827 に答える