2012-03-15 91 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); 
} 
} 
相關問題