Синхронизация: события onerror и n ++ - PullRequest
0 голосов
/ 20 июня 2010

Я просто читаю немного в JavaScript и наткнулся на некоторый код, который обрабатывает процесс загрузки изображений:

var n = 0;
...
for (...) {
  ...
  image[i].onload = function { n++; };
}

Безопасен ли этот фрагмент кода или может быть любой тип гонки при доступепеременная n?

Ответы [ 2 ]

3 голосов
/ 20 июня 2010

Время, когда происходит событие ONLOAD для каждого изображения (относительно друг друга, если вообще когда-либо), обычно недетерминировано.Рассмотрим такие проблемы, как кэш браузера или одновременные загрузки или неудачные попытки.

Однако , в каждый момент времени существует только один «контекст выполнения» JavaScript;то есть окончательное значение n будет отражать общее количество обращений к обработчику ONLOAD (в данный момент времени).То есть для данной страницы все JS являются атомарными, пока не завершится (уступает браузеру, пока не произойдет событие)

«Web Workers» также вписываются в эту модель событий;не существует традиционного "состояния гонки" между потоками и доступом к переменным.Однако любое общее (изменяемое) состояние между задачами может привести к состоянию гонки, хотя и на более высоких уровнях.

0 голосов
/ 20 июня 2010

Это довольно безопасно, так как большинство JavaScript выполняется в однопоточном контексте. Единственное предостережение - это Web Workers, но они разработаны достаточно хорошо и могут общаться только через сообщения JSON.

...