Почему Javascript не ждет нужное количество времени?
Этот код не работает должным образом:
Выход:
$ node test.js
just in time: Waited 0 seconds...
earlier 993 ms: Waited 1 seconds...
earlier 993 ms: Waited 2 seconds...
late 10 ms: Waited 3 seconds...
late 2011 ms: Waited 4 seconds...
late 5013 ms: Done
Откуда эта разница?
1 ответ
Откуда эта разница?
Потому что вы неправильно измеряете. Прежде всего, вы делаете
console.log(diff(start + i * 1000) + `: Waited ${i} seconds...`);
перед
await sleep(i * 1000);
. Этот тест должен быть после
sleep
.
Другая проблема заключается в том, что вы не меняете значение и всегда используете одно и то же значение в качестве эталона для каждой итерации.
Так после
i>1
вы получите неправильные результаты: вы уже ждали
1
во-вторых, так для
i=2
общее время, прошедшее с
(1 + 2)
секунды, для
i=3
к общему времени, прошедшему с
start
является
(1 + 2 + 3)
секунды, ... .
Обновление кода таким образом, чтобы предыдущие сонные секунды также включались в расчет, дает ожидаемый результат:
Результат всегда будет
late
потому что
setTimeout
будет ждать по крайней мере заданное количество времени. И для того, как вы измеряете, эта ошибка будет накапливаться для каждого вызванного таймера.