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 tickem 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.nextTickque é chamado no loop de eventos como um único ticke está bem explicado aqui . É claro que no navegador não existe, process.nextTickentão temos que descobrir como fazer isso.
Esta aplicação irá instalar uma nextTickfunçã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