Angenommen, die von @abarber vorgeschlagene Lösung ist eine gute Lösung, da sie verwendet wird, (new Date()).getTime()sodass sie ein Fenster von Millisekunden hat und tickbei Kollisionen in diesem Intervall a summiert. Wir könnten in Betracht ziehen, die integrierte Lösung zu verwenden, wie wir hier in Aktion deutlich sehen können:
Zunächst können wir hier sehen, wie es zu Kollisionen im 1/1000 Fensterrahmen kommen kann, indem wir (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
Zweitens versuchen wir die vorgeschlagene Lösung, die Kollisionen im 1/1000 Fenster vermeidet:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Das heißt, wir könnten in Betracht ziehen, Funktionen wie den Knoten process.nextTick, der in der Ereignisschleife aufgerufen wird, als einzelne zu verwenden, tickund dies wird hier gut erklärt . Natürlich gibt es im Browser keine, process.nextTickalso müssen wir herausfinden, wie das geht.
Diese Implementierung wird eine Installation von nextTickFunktion im Browser mit den meisten näheren Funktionen an das I / O in dem Browser, sind setTimeout(fnc,0), setImmediate(fnc), window.requestAnimationFrame. Wie hier vorgeschlagen , könnten wir das hinzufügen window.postMessage, aber ich überlasse dies dem Leser, da es auch ein benötigt addEventListener. Ich habe die ursprünglichen Modulversionen geändert, um es hier einfacher zu halten:
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() )
})
})
Also haben wir im 1/1000 Fenster:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966