Якщо припустити, що рішення, запропоноване @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
тому ми повинні розібратися, як це зробити.
Ця реалізація встановить anextTick
функцію в браузері , використовуючи найближчі функції введення / виводу в браузері, які 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