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 tickin 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.nextTickche viene chiamato nel ciclo di eventi come un singolo ticked è ben spiegato qui . Ovviamente nel browser non c'è, process.nextTickquindi dobbiamo capire come farlo.
Questa implementazione installerà una nextTickfunzione 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