Zakładając, że rozwiązanie zaproponowane przez @abarber to dobre rozwiązanie, ponieważ używa (new Date()).getTime()
tak, że ma okienka milisekund i sumę a tick
w przypadku kolizji w tym interwale, moglibyśmy rozważyć użycie wbudowanego, co wyraźnie widać tutaj w akcji:
Po pierwsze, możemy zobaczyć, jak mogą wystąpić kolizje w ramie okna 1/1000 przy użyciu (new Date()).getTime()
:
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1155:1 1469615396590
VM1155:1 1469615396591
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1156:1 1469615398845
VM1156:1 1469615398846
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1158:1 1469615403045
VM1158:1 1469615403045
Następnie wypróbowujemy proponowane rozwiązanie, które pozwala uniknąć kolizji w oknie 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
To powiedziawszy, moglibyśmy rozważyć użycie funkcji, takich jak węzeł, process.nextTick
który jest wywoływany w pętli zdarzeń, jako pojedynczego tick
i jest to dobrze wyjaśnione tutaj . Oczywiście w przeglądarce nie ma, process.nextTick
więc musimy wymyślić, jak to zrobić.
Ta realizacja będzie zainstalować nextTick
funkcję w przeglądarce przy użyciu najbardziej bliższych funkcje I / O w przeglądarce, które są setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Jak sugerowano tutaj, możemy dodać window.postMessage
, ale zostawiam to czytelnikowi, ponieważ potrzebuje addEventListener
również. Zmodyfikowałem oryginalne wersje modułów, aby było to prostsze tutaj:
getUniqueID = (c => {
if(typeof(nextTick)=='undefined')
nextTick = (function(window, prefixes, i, p, fnc) {
while (!fnc && i < prefixes.length) {
fnc = window[prefixes[i++] + 'equestAnimationFrame'];
}
return (fnc && fnc.bind(window)) || window.setImmediate || function(fnc) {window.setTimeout(fnc, 0);};
})(window, 'r webkitR mozR msR oR'.split(' '), 0);
nextTick(() => {
return c( (new Date()).getTime() )
})
})
Mamy więc w oknie 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966