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

您可以将超时代码与其实际调用的函数分开,然后手动或自动调用它。

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(),它会执行此操作,然后再次重新设置超时。

  • 此方法在全局范围内使用三个变量,如果这是一个大型应用程序,可能值得对其进行更多重构。
于 2012-12-02T07:03:05.827 回答
0

在这种情况下,我不会setTimeout()在函数中使用。下面的代码确保每次调用时都会终止 ajax 请求poll()(开始时一次,每 5 秒一次以及每次 keyup 事件调用)

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 回答