2011-11-27 85 views
2

是的,我知道,要求在Javascript正式的內存模型是一個沒有希望的事業,所以我妥協,「所有的瀏覽器遵循這些規則」什麼的。JavaScript中的內存模型

我的問題是這樣的:我要送事件定義的時間間隔,以一臺服務器,但事件可能,而這樣做,被添加到我的陣列,即:

function storeEvent(event) { 
    // may be called at any time 
    storedEvents.push(event); 
} 

function broadcastEvents() { 
    if (storedEvents.length !== 0) { 
     var eventString = JSON.stringify(storedEvents); 
     storedEvents = []; 
     // send eventString to server 
    } 
    window.setTimeout(broadcastEvents, BROADCAST_TIMER); 
} 

有沒有在一個明顯的競爭條件在那裏,甚至沒有想到失蹤的記憶障礙。

怎麼辦?真的在這裏失蹤了Java內存模型..

+1

查看[這篇文章](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)簡要描述了javascript事件隊列的工作原理以及爲什麼這不是一個競爭條件。 – jfriend00

+0

@ jfriend00謝謝 - 所以它基本上是沒有重入的通常的消息泵實現。很高興知道,即使除了「它是單線程的」之外沒有關係:) – Voo

+0

是的,這是描述它的好方法。 – jfriend00

回答

4

沒有任何競爭條件。在瀏覽器中

所有JavaScript代碼是單線程的。

雖然它沒有做其他任何事情的setTimeout回調將在UI線程上運行。

+0

因此,所有來自彗星服務器廣播的用戶事件setTimeouts()都被推送到一個消息隊列中,然後由一個線程處理?不是最有效的東西,但我假設夠簡單。我可以在那裏讀到嗎? – Voo

+0

@Voo:正確。 HTML5網絡工作者允許您使用後臺線程。閱讀什麼? – SLaks

+0

之前問我四處張望了一下,以及整個ECMA規範沒有一次提到了「線程」的任何地方 - 所以我只是想知道你是否知道一些源在瀏覽器中的「實際執行」的 - 只是出於好奇和第二一瞥不可能存在。看着Web工作者的MDN文檔 - 有趣的是,謝謝(避免通過消息解析來解決整個共享內存混亂是最好的解決方案)。 – Voo