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