Assumindo que a solução proposta por @abarber é uma boa solução porque usa (new Date()).getTime()
por isso tem janelas de milissegundos e soma a tick
em caso de colisões neste intervalo, poderíamos considerar o uso de built-in como podemos ver claramente aqui em ação:
Em primeiro lugar, podemos ver aqui como pode haver colisões na moldura da janela 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
Em segundo lugar, tentamos a solução proposta que evita colisões na janela 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Dito isso, poderíamos considerar o uso de funções como o nó process.nextTick
que é chamado no loop de eventos como um único tick
e está bem explicado aqui . É claro que no navegador não existe, process.nextTick
então temos que descobrir como fazer isso.
Esta aplicação irá instalar uma nextTick
função no navegador usando as funções mais mais perto do I / O no navegador que são setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Como sugerido aqui , poderíamos adicionar o window.postMessage
, mas deixo isso para o leitor, pois ele também precisa de um addEventListener
. Modifiquei as versões originais do módulo para mantê-lo mais simples aqui:
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() )
})
})
Portanto, temos na janela 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966