Условия гонки с setTimeout в расширении Firefox?

Что происходит, когда я вызываю setTimeout в расширении Firefox? Есть ли когда-нибудь условие, при котором несколько обратных вызовов могут выполняться одновременно?

Мое расширение Firefox содержит массив URL-адресов, с которых я хочу сделать снимки экрана. Мое расширение открывает 5 вкладок и устанавливает URL-адреса этих вкладок как первые 5 URL-адресов в массиве. После завершения загрузки страницы на вкладке N я хочу подождать 30 секунд, сделать снимок экрана, а затем извлечь следующий URL-адрес из массива и загрузить его на вкладке N. Процесс повторяется до тех пор, пока список URL-адресов не станет пустым.

Как я могу быть уверен, что каждый URL-адрес обрабатывается ровно один раз? Если бы я писал это на Java, я бы просто синхронизировал все обращения к моему списку URL-адресов. Как я могу добиться этого в расширении Firefox?


person Rob Crowell    schedule 24.08.2010    source источник


Ответы (1)


Javascript полностью однопоточный (за исключением новой функции Workers, которая является отдельной).

Никакие два обратных вызова не могут выполняться одновременно.

person SLaks    schedule 24.08.2010
comment
Верно ли это для javascript, работающего в браузере Chrome? Я запускаю привилегированный javascript как часть расширения Firefox. Код не выполняется на какой-либо конкретной вкладке и не является частью какого-либо HTML-документа. - person Rob Crowell; 24.08.2010
comment
@Rob: я достаточно уверен, что это так. - person SLaks; 24.08.2010
comment
@sdwilsh: у вас есть ссылка? - person SLaks; 24.08.2010
comment
@sdwilsh: применяется ли правило однопоточности и для XMLHttpRequest? Если я выполняю несколько вызовов отправки асинхронно, будет ли одновременно отправляться более одного вызова или они также будут стоять в очереди? - person Rob Crowell; 25.08.2010
comment
@Rob: запросы будут отправляться параллельно, но обратные вызовы будут выполняться последовательно в потоке пользовательского интерфейса. - person SLaks; 25.08.2010
comment
@SLaks нет, но это тот же движок JS, поэтому он имеет те же ограничения (только ему доступно больше API). - person sdwilsh; 26.08.2010