Предполагается, что решение, предложенное @ abarber , является хорошим решением, поскольку использует (new Date()).getTime()
, поэтому у него есть окна в миллисекундах и сумма tick
в случае коллизий в этом интервале, мы могли бы рассмотреть использовать встроенный в качестве
мы можем ясно увидеть здесь в действии:
Сначала мы можем увидеть, как могут быть столкновения в оконной раме 1/1000, используя (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
Во-вторых, мы попробуем предлагаемое решение, позволяющее избежать столкновений в окне 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Тем не менее, мы могли бы рассмотреть возможность использования таких функций, как узел process.nextTick
, который вызывается в цикле событий как один tick
, и это хорошо объяснено здесь .
Конечно, в браузере нет process.nextTick
, поэтому мы должны понять, как это сделать.
Эта реализация установит функцию nextTick
в браузере, используя функции, наиболее приближенные к входам / выходам в браузере: setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Как предлагалось здесь , мы могли бы добавить window.postMessage
, но я оставляю это читателю, так как для него также требуется addEventListener
. Я изменил исходные версии модуля, чтобы упростить его здесь:
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() )
})
})
Итак, у нас в окне 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966