@Abarber tarafından önerilen çözümün iyi bir çözüm olduğunu varsaydık , çünkü kullanıyor (new Date()).getTime()bu yüzden milisaniyelik bir pencereye sahip vetick bu aralıkta çarpışma olması durumunda kullanır, burada eylemde açıkça görebileceğimiz gibi yerleşik kullanmayı düşünebiliriz:
İlk olarak, 1/1000 pencere çerçevesinde nasıl çarpışmalar olabileceğini kullanarak (new Date()).getTime()şunları görebiliriz:
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
İkinci olarak, 1/1000 penceresinde çarpışmaları önleyen önerilen çözümü deniyoruz:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Bununla process.nextTickbirlikte, olay döngüsünde çağrılan düğüm gibi işlevleri tek olarak kullanmayı düşünebiliriz tickve burada iyi açıklanmıştır . Tabii ki tarayıcıda yok, process.nextTickbu yüzden nasıl yapılacağını bulmalıyız.
Bu uygulama bir kuracaktır nextTickolan tarayıcıda I / O en yakın işlevlerini kullanarak tarayıcıda işlevini setTimeout(fnc,0), setImmediate(fnc), window.requestAnimationFrame. Önerildiği gibi burada biz ekleyebilir window.postMessage, ama bir ihtiyacı beri okuyucuya bu terk addEventListeneryanı. Burada daha basit tutmak için orijinal modül sürümlerini değiştirdim:
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() )
})
})
Yani 1/1000 penceresinde var:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966