2016-08-12 28 views
0

我有一個困境。我使用此代碼來生成唯一的ID並將其存儲在Cookie或本地存儲中。如果沒有以前的ID設置,我只會生成此ID。javascript同步代碼執行之間的選項卡

//read the ID from cookie or local storage 
var id=readID(); 
if(id==null){ 
    //no ID found, generate an ID 
    id=generateID(); 

    //store the ID to use it when we come back 
    storeID(id); 
} 

此代碼的工作,因爲我預期大約90%的時間,從而產生只有一個ID,但有時當與沒有ID的用戶打開的同時2個或多個突出部(或在非常短的間隔)它最終生成2個ID。 我感興趣的是一些黑客策略,在讀取,生成和存儲ID時鎖定代碼,並且僅在一個選項卡中執行。直到鎖定被釋放。

我知道這可能不起作用,因爲標籤是分開的,但我在想,如果你能鎖定一個本地存儲對象的讀寫?

我也接受其他解決方案。

更新:有人問我怎麼算法是generateID。我說沒關係,但爲了簡化,我們將使用Math.random()這樣的:

function generateID(){ 
    return Math.random(); 
} 
+1

生成一個ID需要多長時間? – FrankerZ

+1

閱讀http://balpha.de/2012/03/javascript-concurrency-and-locking-the-html5-localstorage/ – SLaks

+0

我想我需要看到什麼readID()和generateID都在做,但localStorage的至少應該在標籤之間進行溝查看Web Storage API以供參考。 https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API – Ivan

回答

1

假設你readID功能是快速。試試這個:

const now = new Date().getTime() // Number -> 1471016775000 (ms since epoch) 
const id = readID() 
if (!id) { 
    storeID(now) 
    id = generateID() 
    const lookup = readID() 
    if (lookup === now) { 
     // this confirms this is the window that started generating the ID 
     storeID(id) 
    } 

} 
+0

哈哈...好的黑客,唯一的問題將是,如果2個標籤有相同的價值 –

+0

糟糕。從第一行中刪除/ 1000毫秒。這個代碼將會在多個標籤中使用相同的MILLISECOND在時代以後執行的可能性相當不可能。任何用於鎖定的好價值。 – Celani

+0

是的。我找到了一個更復雜的庫,看起來和你的例子很相似。他們使用日期+隨機數只是爲了確保。 'NOW()+ 「:」 + someNumber();':https://bitbucket.org/balpha/lockablestorage/src/96b7ddb1962334cde9c647663d0053ab640ec5a1/lockablestorage.js?fileviewer=file-view-default –