Update 2019 mit Atomics.wait
Es sollte funktionieren in Node.js 9.3 oder höher.
Ich brauchte einen ziemlich genauen Timer in Node.js, und dafür funktioniert er hervorragend.
Es scheint jedoch, dass die Unterstützung in den Browsern äußerst begrenzt ist.
let ms = 10000;
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
Ich habe ein paar 10-Sekunden-Timer-Benchmarks durchgeführt.
Mit setTimeout erhalte ich einen Fehler von bis zu 7000 Mikrosekunden (7 ms).
Mit Atomics scheint mein Fehler unter 600 Mikrosekunden (0,6 ms) zu bleiben.
Update 2020: Zusammenfassung
function sleep(millis){ // Need help of a server-side page
let netMillis = Math.max(millis-5, 0); // Assuming 5 ms overhead
let xhr = new XMLHttpRequest();
xhr.open('GET', '/sleep.jsp?millis=' + netMillis + '&rand=' + Math.random(), false);
try{
xhr.send();
}catch(e){
}
}
function sleepAsync(millis){ // Use only in async function
let netMillis = Math.max(millis-1, 0); // Assuming 1 ms overhead
return new Promise((resolve) => {
setTimeout(resolve, netMillis);
});
}
function sleepSync(millis){ // Use only in worker thread, currently Chrome-only
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, millis);
}
function sleepTest(){
console.time('sleep');
sleep(1000);
console.timeEnd('sleep');
}
async function sleepAsyncTest(){
console.time('sleepAsync');
await sleepAsync(1000);
console.timeEnd('sleepAsync');
}
function sleepSyncTest(){
let source = `${sleepSync.toString()}
console.time('sleepSync');
sleepSync(1000);
console.timeEnd('sleepSync');`;
let src = 'data:text/javascript,' + encodeURIComponent(source);
console.log(src);
var worker = new Worker(src);
}
von denen die serverseitige Seite, z. B. sleep.jsp
Sieht so aus:
<%
try{
Thread.sleep(Long.parseLong(request.getParameter("millis")));
}catch(InterruptedException e){}
%>