2011-10-05 23 views
0

運行多次預防功能,我有一些代碼,做這方面的工作:與JavaScript中

var _init = false; 

this.init = function(){ 

    if(_init) 
     return; 
    else 
     _init = true; 

    // Do a bunch of stuff here 
} 

在我看來,有一個微小的競爭條件存在,我想消除。在第一個實例已經開始設置_init爲真之前,可以使第二個init函數實例開始運行。不太可能,但不是零,是的?

鑑於此,有沒有一種簡單的方法可以消除這種競爭條件,比如Singleton模式?

+2

由於javascript是單線程的,因此在任何給定時間只有一個執行線程,因此在測試'_init'變量時,沒有其他人可以調用您的函數。 – jfriend00

回答

4

javascript是單線程的(暫時忽略網絡工作者),所以你應該沒問題 - 應該沒有競爭條件。

我覺得這樣的「標準」的方式,但是,這是使用自調用函數

(function(){ 
    // init stuff here, but you don't need to have any of the _init stuff 
})() // <-- this causes your function to be invoked immediately 
+0

真棒,感謝您的信息。我需要在某些情況下從定時器調用init函數,所以我需要將它傳遞給'setTimeout()'。如果我不想將整個函數作爲匿名函數放入setTimeout(),那麼我就不能自己調用​​圓括號並且必須以某種方式分配給變量,對吧? – Trott

+0

@trott,即時通訊不太清楚你的意思是...你可以用完整的細節更新你的問題嗎? – hvgotcodes

+0

沒關係,你回答了這個問題。我正在詢問有關我的具體情況的後續行動。我想我已經整理出來了,如果我不這樣做,我會把它作爲一個單獨的問題發佈。謝謝! – Trott

0

一個簡單的方法,以確保該功能只運行一次是簡單地刪除方法在結束:

this.init = function(){ 
    // Do a bunch of stuff here 

    // now delete: 
    delete this.init; 
} 

,或者你可以在屬性重新分配給無操作,如果你需要能夠再次調用它:

this.init = function(){ 
    // Do a bunch of stuff here 

    this.init - function() {}; 
} 

但是這隻能確保函數運行一次每個實例 - 如果您需要它只運行一次,有史以來,您的基於標誌的方法可能會更好,正如其他海報所建議的,您對於比賽的擔心條件與單線程代碼沒有關係。