Suponiendo que la solución propuesta por @abarber es una buena solución porque usa (new Date()).getTime()
por lo que tiene ventanas de milisegundos y suma a tick
en caso de colisiones en este intervalo, podríamos considerar el uso de built-in como podemos ver claramente aquí en acción:
Primero, podemos ver aquí cómo puede haber colisiones en el marco de la ventana 1/1000 usando (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
En segundo lugar, probamos la solución propuesta que evita colisiones en la ventana 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Dicho esto, podríamos considerar usar funciones como el nodo process.nextTick
que se llama en el bucle de eventos como un solo tick
y está bien explicado aquí . Por supuesto, en el navegador no hay, process.nextTick
así que tenemos que averiguar cómo hacerlo.
Esta aplicación se instalará una nextTick
función en el navegador usando las mayoría de las funciones más cerca de la E / S en el navegador que son setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Como se sugiere aquí , podríamos agregar el window.postMessage
, pero se lo dejo al lector ya que también necesita un addEventListener
. He modificado las versiones originales del módulo para que sea más simple aquí:
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() )
})
})
Entonces tenemos en la ventana 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966