如何设计优雅的js轮询程序?

时间:2014-04-08 01:18:06

标签: javascript

我有一个要求,我需要通过js中的ajax轮询数据库以检查状态。如果状态为“活动”,则应停止轮询并弹出警报“案例现在处于活动状态”。 js应该每2秒检查一次db,直到db status返回“active”。你能为此提供一个优雅的js例程吗?这里有一些通用的js来展示我想要做的事情:

function ReportAsActivePoll()
{
   for(var i=0; i<10; i++)
   { 
      setTimeout(StatusIsActive,(i*2000));
      if(statusIsActive)
      {
         ReportAsActive();
         break;
      }
   }
}

var statusIsActive = false;
function StatusIsActive(case)
{
   statusIsActive = GetStatusFromDB(case) == "active";
}

function ReportAsActive()
{
   alert("case is now active")
}

一些注意事项:

  • 我知道上面的代码不正确。这只是为了说明目的。
  • 上面的代码将调用StatusIsActive 10次。我想在状态激活后调用停止/中断/停止。但是,我认为民意调查要求提前排队所有的电话,所以我不知道如何实现这一目标。

2 个答案:

答案 0 :(得分:0)

为简单起见,请使用setInterval()clearInterval()。像这样:

<script type="text/javascript">

function checkStatus(theCase) {
    var intervalId = window.setInterval(function() {
        if (getStatusFromDb(theCase) == 'active') {
            clearInterval(intervalId)
            reportAsActive()
        }
    }, 2000)
}
function reportAsActive()
{
   alert("case is now active")
}

var tmpCounter = 0
function getStatusFromDb(theCase)
{
    if (tmpCounter++ == 4) return "active"
}
checkStatus('case 123')

</script>

您还应该考虑使用小写字母开头,因为这是正常的JS约定。通过选择其他样式,您可能会遇到区分大小写的错误,这些错误很难追踪。

答案 1 :(得分:0)

您需要使用setInterval而不是setTimeout,当您收到有效回复时,您必须使用clearInterval删除此时间间隔。

所以你需要做这样的事情

var intervalID = window.setInterval(function(){
  var resFromYourDB = ...; // get your result via ajax
  if (resFromYourDB['active']){
     window.clearInterval(intervalID);
     // do you alert
  }
}, 2000)

通过这种方式,它将轮询您的服务器,直到它将active作为响应,而不是像setTimeout那样预定义的时间量。此外,当它得到这个回应时,它会完全停止。