2016-08-12 4 views
0

私にはジレンマがあります。私は一意のIDを生成し、それをクッキーまたはローカルストレージに格納するためにこのコードを使用しています。以前のIDが設定されていない場合にのみ、このIDを生成します。それを(または非常に短い間隔で)私は1つのIDを生成し、時間の約90%を予想通り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); 
} 

このコードは動作し、時にはないIDを持つユーザーは、同じ時間内に2つの以上のタブを開いたとき2つのIDが生成されます。 私が興味を持っているのは、IDの読み取り、生成、保存時にコードをロックし、1つのタブでのみ実行するためのハッキング戦略です。ロックが解除されるまで

タブが分離されているため、これはうまくいかないかもしれませんが、読み書きの両方でローカルストレージオブジェクトをロックできると思っていましたか?

私は他のソリューションにもオープンしています。

更新: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

haha​​ ...良いハックですが、2つのタブの値が同じであれば唯一の問題になります –

+0

ミリ秒間、最初の行から/ 1000を削除します。このコードは、同じMILLISECONDを持つ複数のタブで実行される可能性があります。なぜなら、エポックはかなり...おそらくありえないからです。ロックするのに使うどんな価値もあります。 – Celani

+0

はい。私はより複雑なライブラリを見つけました。それはあなたの例に似ています。彼らは日付+乱数だけを使用して確信しています。 'now()+":+ someNumber(); ':https://bitbucket.org/balpha/lockablestorage/src/96b7ddb1962334cde9c647663d0053ab640ec5a1/lockablestorage.js?fileviewer=file-view-default –

関連する問題