2016-08-12 4 views
0

나는 딜레마가있다. 이 코드를 사용하여 고유 ID를 생성하고이를 쿠키 또는 로컬 저장소에 저장합니다. 이전 ID가 설정되지 않은 경우에만이 ID를 생성합니다. 그것 (또는 매우 짧은 간격에서) I 하나만 ID를 생성하는 시간의 약 90 %를 예상자바 스크립트 탭 간 코드 실행 동기화

//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를 읽고, 생성하고 저장하며, 하나의 탭에서만 실행되도록 코드를 잠 그려는 해킹 전략입니다. 자물쇠가 풀릴 때까지

탭이 분리되어 있기 때문에이 기능이 작동하지 않을 수도 있지만 읽기 및 쓰기를 위해 로컬 스토리지 객체를 잠글 수 있다고 생각 했습니까?

다른 솔루션에도 열려 있습니다.

업데이트 : 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 –