2016-08-12 50 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 –

相关问题