2017-05-10 42 views
2

這是關於我的問題的場景。在javascript中,我可以鎖定一個var嗎?

我做了一個var dataCache,它緩衝了我從遠程服務器獲得的數據。我每30秒更新一次dataChache,像這樣,

setInterval(function(){ 
     instance.loadJsonFromRemote(configuration.dataUrl,function(data){ 
     instance.dataCache = data; 
}); 
}, 30000); 

和dataCache可能會在它被更新的同時正好被訪問。

例如,

var cool = instance.dataCache.cool 

上面運行的代碼,而數據更新代碼運行,

instance.dataCache = data; 

我想的可能的解決辦法是,如果鎖數據高速緩存了,而正在被訪問它沒有一個訪問它,它可以被設置。

我可能需要類似於C#中的鎖定,但我真的不知道如何在JavaScript中做到這一點,或者它甚至不是JavaScript中的問題,因爲JS是單線程的並且工作正常。我對JS不是很熟悉。

+3

「JS是單線程的,它工作正常」是的。你不需要鎖定var – R3tep

+1

看看https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop。你是對的,不需要像鎖一樣的東西。 –

+0

雖然也有這個:http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded我不知道你的情況可能會影響你多少。發佈它以防萬一。 –

回答

1

沒有鎖定mechanizm,因爲JavaScript作爲單線程執行。

來自多線程環境的人混淆的原因是JavaScript總是像「異步」方式工作。但事實並非如此。

當某些事件發生時,Javascript在內部使用「回調」,它將執行對Java/.Net開發者來說可能有點棘手的回調。 Javascript總是在一個線程上工作,沒有任何東西可以同時執行,它具有「JavaScript執行週期」(See For Event Loop),可以說這是一個簡單的過程,(1){}代碼在每個循環中一次又一次地執行代碼。

您的情況唯一可能的解決方案是從setTimeout函數的回調,它將觸發您的更新方案。

+1

真的很明確的解釋!非常感謝! –

相關問題