Diasumsikan bahwa solusi yang diusulkan oleh @abarber itu adalah solusi yang baik karena menggunakan (new Date()).getTime()
sehingga memiliki jendela milidetik dan jumlah atick
jika terjadi tabrakan dalam interval ini, kami dapat mempertimbangkan untuk menggunakan bawaan seperti yang dapat kita lihat dengan jelas di sini beraksi:
Pertama, kita dapat melihat di sini bagaimana bisa terjadi tabrakan di bingkai jendela 1/1000 menggunakan (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
Kedua, kami mencoba solusi yang diusulkan yang menghindari tabrakan di jendela 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Yang mengatakan kita dapat mempertimbangkan untuk menggunakan fungsi seperti node process.nextTick
yang dipanggil dalam event loop sebagai satu tick
dan dijelaskan dengan baik di sini . Tentu saja di browser tidak ada process.nextTick
jadi kita harus memikirkan bagaimana cara melakukannya.
Ini implementasi akan menginstal nextTick
fungsi dalam browser menggunakan sebagian besar fungsi lebih dekat dengan I / O di browser yang setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Seperti yang disarankan di sini kita bisa menambahkan window.postMessage
, tapi saya serahkan ini kepada pembaca karena perlu addEventListener
juga. Saya telah memodifikasi versi modul asli agar lebih sederhana di sini:
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() )
})
})
Jadi kita ada di jendela 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966