如何防止 AJAX 函数重叠?

5
我有一个名为「checkEvery15Seconds」的函数,每15秒运行一次。它会检查页面上是否添加了新的评论。
我有一个表单,当点击提交按钮时会提交新的评论,并在页面上显示新评论。
在添加新评论的过程中,「checkEvery15Seconds」同时在查询数据库,因此我最终在页面上得到了重复的评论(不过在数据库中没有,这只是一个纯粹的JavaScript问题)。
如何让我的「submitComment」函数停止「checkEvery15Seconds」并在「submitComment」函数执行完成后重新启动它?

作为另一种解决方案,只需确保在注释ID下不添加该注释即可添加到页面中。使您添加的HTML注释容器具有ID“comment_N”,然后在添加新注释之前检查该元素是否存在。 - Nicole
4个回答

5

在一个可被两个函数访问的作用域中添加一个名为somewhat 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 :-)

    }
}

这正是我想做的。我该如何创建一个像那样的全局变量? - Andrew
只需在其他函数之外声明它,就可以全局访问它。 - Phil Rykoff

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;

如果你想要变得更加疯狂,可以添加一些事件,这样其他对象就可以订阅关于数据库更新成功的通知等等...

0
你需要一个状态变量来指示评论Ajax请求的当前状态。
var requestComments = false;

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

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

0
最简单的解决方案:使用一个标志变量来打开和关闭。您的“checkEvery15Seconds”函数的第一行应该是:if (!global_checkingEvery15Seconds) return; 只需在需要打开检查时将该变量(无论您将其命名为全局还是对象绑定)设置为true,在不需要时将其关闭即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接