Supposons que la solution proposée par @abarber soit une bonne solution car elle utilise (new Date()).getTime()
donc une fenêtre de millisecondes et somme untick
en cas de collisions dans cet intervalle, nous pourrions envisager d'utiliser intégré comme nous pouvons clairement le voir ici en action:
Tout d'abord, nous pouvons voir ici comment il peut y avoir des collisions dans le cadre de la fenêtre 1/1000 en utilisant (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
Ensuite, nous essayons la solution proposée qui évite les collisions dans la fenêtre 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Cela dit, nous pourrions envisager d'utiliser des fonctions comme le nœud process.nextTick
appelé dans la boucle d'événements en tant que simple tick
et c'est bien expliqué ici . Bien sûr, dans le navigateur, il n'y en a pas process.nextTick
, nous devons donc comprendre comment faire cela.
Cette mise en œuvre installera une nextTick
fonction dans le navigateur en utilisant le plus des fonctions plus proches qui sont le E / S dans le navigateur setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Comme suggéré ici, nous pourrions ajouter le window.postMessage
, mais je laisse cela au lecteur car il en a également besoin addEventListener
. J'ai modifié les versions originales des modules pour les simplifier ici:
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() )
})
})
Nous avons donc dans la fenêtre 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966