#javascript #google-chrome #dom-events #settimeout #alert
#javascript #google-chrome #dom-события #settimeout #предупреждение
Вопрос:
Как вы можете видеть, блокирующая функция, например alert()
, выдает свой вывод не по порядку, когда заполняется в очереди событий функции Google Chrome by setTimeout()
, на основе этого кода:
for (var i = 1; i <= 6; i ) {
(function(index){
setTimeout(function() { alert(index) }, 100);
})(i);
}
- Почему это так?
- Считается ли это ошибкой Google Chrome?
Этому должно быть объяснение.
Комментарии:
1. Отдельно: для ясности укажите, какой результат вы видите.
2. Вы говорите Chrome выполнить 6 раз
alert()
функцию одновременно через 100 миллисекунд. Чего вы ожидаете?3. Я ожидаю, что они будут напечатаны по порядку, как и в других браузерах…
4. Тогда ваша логика неверна. Странно ожидать, что компьютер будет выполнять несколько операций одновременно (в js многопоточности нет). Вам нужно переместить цикл внутри setTimeout, чтобы получить ожидаемые результаты.
5. у opera тоже есть эта проблема
Ответ №1:
Как правило, имеет смысл ожидать, что в любой данный момент (скажем, с точностью до миллисекунды) существует только один слот выполнения, и все события (например setTimeout
, обратные вызовы), которые должны произойти в этот момент, должны быть в одной очереди. Похоже, это ожидание операции здесь.
Однако нет ничего, что требовало бы, чтобы браузеры работали таким образом, и реальность того, как все происходит по расписанию, намного сложнее, а также зависит от браузера.
Поэтому лучше всего никогда не полагаться на относительный порядок любых двух событий, независимо от того, насколько вы считаете, что они должны быть предсказуемыми.
Здесь у меня есть архивное сообщение в блоге о своеобразной природе таймеров и моих (похожих) разочарованиях в них: https://web.archive.org/web/20151029223348/http://blog.getify.com/on-the-nature-of-timers