Giả sử rằng giải pháp do @abarber đề xuất thì đó là một giải pháp tốt vì sử dụng (new Date()).getTime()
nên nó có cửa sổ mili giây và tính tổngtick
trong trường hợp có va chạm trong khoảng thời gian này, chúng tôi có thể cân nhắc sử dụng tích hợp sẵn vì chúng ta có thể thấy rõ ở đây:
Nắm tay, chúng ta có thể thấy ở đây cách có thể có va chạm trong khung cửa sổ 1/1000 bằng cách sử dụng (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
Thứ hai, chúng tôi thử giải pháp được đề xuất để tránh va chạm trong cửa sổ 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Điều đó nói rằng chúng ta có thể xem xét sử dụng các chức năng như nút process.nextTick
được gọi trong vòng lặp sự kiện như một nút duy nhất tick
và nó được giải thích rõ ở đây . Tất nhiên trong trình duyệt không có process.nextTick
vì vậy chúng tôi phải tìm cách làm điều đó.
Đây thực hiện sẽ cài đặt một nextTick
chức năng trong trình duyệt bằng cách sử dụng chức năng gần nhất để các I / O trong trình duyệt đó là setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Như đã đề xuất ở đây, chúng tôi có thể thêm window.postMessage
, nhưng tôi để điều này cho người đọc vì nó cũng cần addEventListener
. Tôi đã sửa đổi các phiên bản mô-đun ban đầu để đơn giản hơn ở đây:
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() )
})
})
Vì vậy, chúng tôi có trong cửa sổ 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966