|   |   | 
| 
 | [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) Да, выглядит проще для тех, кто привык к такому стилю. Писали уже выше. Проблема была не в этом.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |