如何锁定AJAX函数重叠?

时间:2010-03-09 23:24:07

标签: javascript ajax

我有一个每15秒运行一次的函数checkEvery15Seconds。它会检查是否已将新注释添加到页面中。

按下提交按钮后,我有一个提交新评论的表单,然后在页面上显示新评论。

在添加新注释checkEvery15Seconds的过程中,同时查询数据库,所以我最终在页面上有重复的注释(不是在数据库中,但这纯粹是一个JavaScript问题)。

如何让“submitComment”函数停止checkEvery15Seconds并在“submitComment”函数执行完毕后重新启动它?

4 个答案:

答案 0 :(得分:5)

在两个函数都可以访问的范围中添加一个名为some suspend15sCheck的布尔值。在添加评论时启用它,然后再将其设置为false。

在15sCheck功能中,您首先要检查是否可以检查: - )

var suspend15sCheck = false;

function addComment()
{
  suspend15sCheck = true;

  // add comment on base of form data

  suspend15sCheck = false;
}

function myTimer()
{
    if(suspend15sCheck === false) 
    {

      // add comments via ajax request
      // remember to check if the comments who will be added already exist :-)

    }
}

答案 1 :(得分:0)

将其包装在允许其他功能在其上设置启动/停止标志的对象中。

function My15SecondsObj() {
    var objSelf = this;

    // 
    this.run();
}

My15SecondsObj.Paused = false;
My15SecondsObj.prototype.run= function() { 
   if (!Paused)
   {
      // Do your call here
   }
   var _this = this;
   setTimeout(function() { _this.run(); }, 15000);

}

现在,当您想要使用此对象时,只需执行

var myObj = new My15SecondsObj();

当你想暂停时,

myObj.Paused = true;

并通过执行以下操作再次启动:

myObj.Paused = false;

如果你想变得非常疯狂,可以添加一些事件,以便其他对象可以订阅有关数据库更新成功的时间等的通知......

答案 2 :(得分:0)

最简单的解决方案:使用您打开和关闭的标记变量。 “checkEvery15Seconds”函数的第一行显示为:if (!global_checkingEvery15Seconds) return;

只需将该变量(无论您将其命名为全局或对象)设置为true,如果您希望打开检查,则将其设置为true,否则设置为off。

答案 3 :(得分:0)

您需要一个状态变量来指示评论ajax请求的当前状态

var requestComments = false;

if(requestComments === false) {
  requestComments = true;
  // make ajax request

  // on ajax success/fail
  requestComments = false;
}