Supponendo che la soluzione proposta da @abarber sia una buona soluzione perché usa (new Date()).getTime()
quindi ha una finestra di millisecondi e somma a tick
in caso di collisioni in questo intervallo, potremmo considerare di utilizzare built-in come possiamo vedere chiaramente qui in azione:
Per prima cosa possiamo vedere qui come ci possono essere collisioni nel telaio della finestra 1/1000 utilizzando (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
In secondo luogo proviamo la soluzione proposta che evita le collisioni nella finestra 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Detto questo, potremmo considerare di utilizzare funzioni come il nodo process.nextTick
che viene chiamato nel ciclo di eventi come un singolo tick
ed è ben spiegato qui . Ovviamente nel browser non c'è, process.nextTick
quindi dobbiamo capire come farlo.
Questa implementazione installerà una nextTick
funzione nel browser utilizzando le maggior parte delle funzioni più vicino alla I / O nel browser che sono setTimeout(fnc,0)
, setImmediate(fnc)
,window.requestAnimationFrame
. Come suggerito qui potremmo aggiungere il window.postMessage
, ma lascio questo al lettore poiché ha bisogno di unaddEventListener
. Ho modificato le versioni del modulo originale per renderlo più semplice qui:
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() )
})
})
Quindi abbiamo nella finestra 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966