2014-10-01 50 views
0

我正在使用BreezeJS並在本地存儲中存儲/恢復數據。這很好。當用戶打開多個選項卡時會發生此問題。每個選項卡中的更改會相互打破。更改應該在選項卡之間同步。使用BreezeJS和localStorage的Tab-to-tab通信

注:BreezeJS將負責合併更改,我只需要處理選項卡之間的競爭條件。

var stashName = 'stash_everything'; 

window.setInterval(function() { 
    var exportData = manager.exportEntities(); 
    window.localStorage.setItem(stashName, exportData); 
}, 5000); 

addEvent(window, 'storage', function (event) { 
    if (event.key == stashName) { 
    var importData = window.localStorage.getItem(stashName); 
    manager.importEntities(importData); 
    } 
}); 

我試着聽'存儲'事件,但我一直無法讓它成功工作。我要麼仍然會發生變化,要麼陷入無限循環。

問題的癥結在於我只是在計時器上儲蓄;如果我只在用戶交互後保存,那麼我會避免(大部分)競爭條件。據我所知,沒有「用戶改變了什麼,因爲上次我問你」微風輕拂,儘管如此。

有沒有人有如何解決這個問題的建議?

回答

0

嗯,這似乎並不是因爲許多原因不能避免出現問題,但主要原因是您仍然不會防止每個選項卡使用不同的數據集進行併發保存。話雖這麼說,如果你是舒服的事實,兩個緩存可能是不同步的只是使用一些獨特的標識符 -

某處在您的應用程序的負載 -

var stashName = 'stash-everything-' + new Date().getTime(); 

window.setInterval(function() { 
    var exportData = manager.exportEntities(); 
    window.localStorage.setItem(stashName, exportData); 
}, 5000); 

現在每個標籤有一個唯一一套數據工作。

+0

兩個標籤應該同步,否則這將工作正常。更新的問題在這一點上要清楚。 – studds 2014-10-02 16:27:46

+0

這改變了你的問題的結構。這是一個很大的問題,需要做出許多設計決定,而不是相互覆蓋。我不認爲這個問題是適合在這裏了:) – 2014-10-02 16:31:15

+0

嗯,我假設關注是合併變化?微風照顧這一點。我只需要確保每個選項卡以正確的順序讀取/寫入local storage。 – studds 2014-10-03 10:20:39