当我有定时轮询功能时,如何手动调用它?

时间:2012-12-02 04:53:57

标签: javascript jquery ajax

我有以下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(),它表示该函数不存在。

3 个答案:

答案 0 :(得分: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'
      );
   }
});

答案 1 :(得分: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(),它会执行操作,然后重新设置超时。

  • 此方法在全局范围内使用三个变量,如果这是一个大型应用程序,则可能值得重构一些。

答案 2 :(得分:0)

在这种情况下,我不会在函数中使用setTimeout()。下面的代码确保每次调用poll()时都会杀死ajax请求(一次启动,每隔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'
      );
   }
});