Точная функция сна javascript - PullRequest
1 голос
/ 06 июня 2019

Я использую JavaScript для отправки набора запросов через регулярные промежутки времени (каждые 5 ms).

Я пытался использовать setTimeout, а также sleep function, но ни у одного из них нет точного времени.

Они гарантируют, что временной интервал будет >= 5ms, но не == 5ms. Есть идеи?

Кажется, что это очень трудно достичь в JavaScript или даже невозможно !!

Это код, который я использую:

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}



async function sendRequest(){ 
    var i;
    for (i=1; i<= numberOfRequests; i++){
        // send my i^th request here
        await sleep(5);
    }
}

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Нет никакого способа предоставить точные тайм-ауты на любом языке программирования, если они существуют в многопрограммной операционной системе общего назначения. Это происходит потому, что точный момент, когда операционная система предоставит свой временной интервал определенному процессу, просто непредсказуем.

Более того, JavaScript является однопоточным и работает с системой цикла событий , а асинхронные задачи (такие как setTimehout, обратный вызов xhr, прослушиватели щелчков и т. Д.) Будут выполняться только после того, как все текущий код закончен. Например, если у вас есть:

setTimeout(() => console.log('hello world'), 500);
for (let i = 0; i<1E100; i++) {
  console.log(Math.sqrt(i));
}

Hello world будет напечатано только после завершения всех расчетов.

0 голосов
/ 06 июня 2019

Поскольку javascript использует однопотоковый цикл обработки событий, невозможно получить такую ​​точность. События в цикле событий выполняются, когда двигатель завершил предыдущую задачу. Если вы зададите задачу, которая будет выполняться через 20 мс (setTimeout, setInterval или любая другая пользовательская задача), движок добавит эту задачу в цикл событий, затем попытается запустить любую другую задачу из цикла (предположим, что функция принимает 25 мс до запуска). Поскольку javascript является однопоточным, вы можете запустить любой другой элемент из цикла, пока задача 25 мс не будет завершена. В этом случае ваш тайм-аут начнется через 25 мс, даже если вы установите его на 20. Вот как работает архитектура javascript.

Даже если вы реализуете многопоточность (рабочие, потоки и т. Д.), Цикл событий все равно будет присутствовать в каждом из них (каждый поток имеет свой собственный цикл)

...