Почему 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будет ждать по крайней мере заданное количество времени. И для того, как вы измеряете, эта ошибка будет накапливаться для каждого вызванного таймера.

Другие вопросы по тегам