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 tick
bei 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, tick
und dies wird hier gut erklärt . Natürlich gibt es im Browser keine, process.nextTick
also müssen wir herausfinden, wie das geht.
Diese Implementierung wird eine Installation von nextTick
Funktion 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