2012-03-15 85 views

回答

7

设置外部标志。

var functionIsRunning = false; 

function myFunction() { 
    if (!functionIsRunning) { 
     functionIsRunning = true; 
     //do stuff 
     functionIsRunning = false; 
    } 
} 

同样的原理适用于jQuery函数。

+4

-1这是行不通的。条件会使函数不能再次运行的唯一方法是,如果从函数内部调用它。只要该函数运行,其他代码就不会在浏览器中运行。 – Guffa 2012-03-15 23:44:48

+0

不正确。 AJAX功能可以并且与其他功能同时运行。 – pete 2012-03-15 23:58:47

+1

这完全错了。没有与其他功能同时运行的特殊“AJAX”功能。 Javascript是单线程的;任何时候只有一个函数在运行。 – Guffa 2012-03-16 00:21:45

7

这很容易。该功能未运行。

JavaScript是严格单线程的。如果浏览器正在响应任何用户事件,则目前没有功能正在运行。

+0

,而这是真的,你可能只想排队后的调用先前的代码已经完成运行。 ESP。如果在第一种情况下使用定时器http://jsfiddle.net/gryzzly/ZGVan/,没有预防动画会堆积起来(我知道jQuery的助手“停止”函数,并且jQuery通常允许您与动画进行交互,但它只是一个参与定时器的例子)。 – 2012-03-15 23:59:25

+0

@gryzzly:这是完全不同的东西。如果您正在等待动画结束,那么您并未检查函数是否正在运行,您正在等待定时器中运行的代码达到特定状态。 – Guffa 2012-03-16 00:26:14

0

你可以设置一个标志。像这样:

(function() { 

    // your application within a closure to not pollute global scope 
    var handlerRunning = false; 
    // the function that will be called and shouldn't be running twice 
    var handler = function() { 
     if (handlerRunning) return; 
     handlerRunning = true; 
     // do stuff here 
     // when you're done, set handlerRunning to false 
     handlerRunning = false; 
    } 

    // assign your code to event handler for example 
    document.getElementById('awesome-button').addEventListener('click', handler, false); 

}()); 
0

没有关闭我的头顶,但你可以使用一个变量来设置是否正在执行的函数。是这样的:

function MyWrapper() {  
    this.running = false; 
    this.run = function() { 
     if (this.running==false) { 
      this.running = true; 
      // do something 
      this.running = false; 
      return true; 
     } 
     else { 
      return false; 
     } 
    }; 
} 
0

使用jQuery.when()

如果单一延迟传递给jQuery.when,承诺对象(属于递延方法的子集)通过该方法返回。可以调用Promise对象的其他方法来附加回调,例如deferred.then。当Deferred被解决或被拒绝时,通常由最初创建Deferred的代码来调用适当的回调函数。例如,通过jQuery.ajax()返回jqXHR对象是一种承诺,可以这样使用:

$.when($.ajax("test.aspx")).then(function(data, textStatus, jqXHR) { 
    alert(jqXHR.status); // Alerts 200 
}); 
0

逾期答复,但我仍想在这里注册我的答案。 我遇到了一个类似的问题,其中我嵌入了setInterval后台服务器检查功能。但是,在我的代码中,还有很多可能性在其他条件下触发相同的功能。所以,为了确保我不记得它,我只是使用本地存储来确保函数不会被一次又一次地调用。

此功能是在我的HTML文件,

function serverCheck(value){ 
localStorage.setItem("isFunctionRunning",1);  
setInterval(checkServerStatus, value); 
} 

以下代码段是我的另一个JS文件,

function xyz(){ 
//someCode 
var checkFunction = localStorage.getItem("isFunctionRunning"); 
if(checkFunction != 1){ 
serverCheck(frequency); 
} 
} 
相关问题