Имя: Пароль:
IT
Веб-мастеринг
[JavaScript] Не пойму правильно ли работает setTimeout
0 Грю
 
29.11.22
06:49
const sleep = () => new Promise(resolve => {
    console.time('Timeout');

    setTimeout(() => {
        console.timeEnd('Timeout');
        resolve();
    }, 500)
});

await [ 1, 2, 3, 4, 5, 6 ].reduce(async (acc) => {
    await acc;
    await sleep();
});
1 Грю
 
29.11.22
06:52
По коду видно что в консоль должно выводиться что-то наподобии следующего:

Timeout: 500 ms
Timeout: 500 ms
Timeout: 500 ms
Timeout: 500 ms
Timeout: 500 ms

Но на практике результат такой:

Timeout: 1342 ms
Timeout: 1002 ms
Timeout: 1002 ms
Timeout: 992 ms
Timeout: 1011 ms

Первый замер получается рандомный, от 600 до 1300 мс, остальные около 1000 мс.
Это правильно? Почему не 500? В чем ошибка?
2 Грю
 
29.11.22
07:14
Попросил друга посмотреть эту тему, у него все работает как надо. Наверное, проблема не в коде, а просто браузер или компьютер у меня тормозит.
3 Asmody
 
29.11.22
09:38
https://developer.mozilla.org/ru/docs/Web/API/setTimeout

delay Необязательный - задержка в миллисекундах (тысячных долях секунды), после которой будет выполнен вызов функции. Реальная задержка может быть больше; см. Notes ниже.
4 Грю
 
03.12.22
06:48
Нашел в чем дело. "Turn on efficiency mode" в настройках производительности браузера.
Причем, другие настройки типа "Improve your PC gaming experience with efficiency mode" никак не влияют.
В подсказке так и написано, что могут появляться тормоза в анимации и в видео.
5 ProgAL
 
03.12.22
12:25
Reduce выполняется синхронно. Скорее всего порядок выполнения не определён. For of async надо смотреть конструкцию.
6 ProgAL
 
03.12.22
12:26
7 Грю
 
04.12.22
06:50
(5) С синхронностью там все нормально, последовательность соблюдается, смотри внимательнее, как раз для этого там стоит await acc;
Проблема была именно в setTimeout, он работал очень неточно, ошибка процентов до 100% случалась, причем рандомно. Как исправил, писал уже выше, в (4).
For - устаревшая конструкция, ее лучше не использовать. Конечно, если очень хочется, то можно. Но я не буду.
8 Грю
 
04.12.22
06:50
(6) Так себе.
9 Fram
 
04.12.22
14:10
Расскажи лучше как там Бостон поживает )
10 Грю
 
05.12.22
18:36
Почему возник вопрос (0): Клиент заказал сделать автоматическую проверку подарочных карт на сайте, а там защита от ботов, клиент блокируется если делать запросы к серверу слишком часто. Пришлось ее обходить через внедрение таймаута. Методом тыка вычислил какой должен быть таймаут чтобы не блокировали запросы, и у меня все отлично работало, а клиент начал ловить блокировки, потому что один и тот же таймаут на моем компе и на компе клиента работали по разному. Вот такая подстава от браузера.
11 Fragster
 
гуру
05.12.22
18:42
(0) если уж есть await, то есть и for of, который асинхронный, так что код божет быть проще:
https://codepen.io/FragsterAt/pen/VwdqbmX
12 Fragster
 
гуру
05.12.22
18:43
13 Грю
 
05.12.22
19:20
(11) Да, выглядит проще для тех, кто привык к такому стилю. Писали уже выше. Проблема была не в этом.