15

Насколько я понимаю, весь код JavaScript управляется событиями и выполняется в одном потоке браузера.Какой поток код JavaScript вызывается из Flash?

Однако у меня есть некоторые функции JavaScript, вызываемые из объекта SWF, находящегося на той же странице. Этот код работает так же, как обычный JS-код, или он находится на какой-то отдельной теме Flash?

Если это отдельный поток, могу ли я использовать setTimeout(), чтобы он запускался в потоке событий JS? например:

function calledFromFlash() { 
    setTimeout(doActualWork, 0); 
} 

function doActualWork() { 
    // blah blah blah 
} 

ответ

10

Он все еще находится на той же теме. Однако для большинства практических целей, если у вас есть такой длинный JavaScript-код, что вы беспокоитесь, ваша «основная» задача может блокировать вызов из setTimeout, вам следует рассмотреть возможность пересмотра вашего базового подхода.

Обновления для щедрот:

Для расширения на более общий вопрос о многопоточности в JavaScript есть a great discussion с очень откровенным ответом от Bobince. Он приводит несколько очень интересных сценариев, которые могут поставить под вопрос, можем ли мы действительно считать JS однопоточным, и его вывод «не совсем».

Вывод из комментариев, которые я согласен, что с точки зрения внутренней среды выполнения JS, вселенная однопоточная, но , потому что инфраструктура, окружающая песочницу JS является не однопоточных, его может достигать внутри песочницы и гадать с состоянием неожиданным образом. Изнутри среды исполнения неизвестный объект может «приостановить законы природы» и изменить ситуацию. Но среда выполнения не имеет потоковой конструкции, чтобы обрабатывать этот сценарий изначально.

Я думаю, что самый важный способ подойти к вопросу - спросить, что мы подразумеваем под многопоточность в практическом сценарии? Обычно проблемы с потоками сводятся к таким вещам, как синхронизация, которые мы должны предположить, что разработчики браузеров решили для нас, потому что у JavaScript нет встроенной конструкции, даже пытаясь справиться с ней сами. Ручное отжимание резьбы не имеет ничего хорошего, кроме инструментов для ее исправления; нет мьютексов или замков.

Так что, отбросив эти катастрофические проблемы, мы не можем справиться с такими вещами, как, может быть, стоимость неожиданно изменилась из-под нас. Но хорошо написанный код должен быть в порядке с этим. Даже в примере Бобинса все задействованные коды по-прежнему являются кодом, который мы добровольно включили в страницу (даже написав сами) так уверенно, что может показаться удивительным, если этот код будет запущен, а ваш главный столбец якобы «заблокирован». Но опять же, говоря о практических проблемах, что самое худшее, что вы могли бы сделать с собой в этом сценарии? Ничего серьезного.

Итак, это мой длинный способ сказать: я не знаю никакой документации от поставщиков браузеров, где они однозначно говорят, является ли их реализация JS однопоточной или нет, но я сомневаюсь, имеет ли это значение.

+0

Hi Rex, Большое спасибо за ваш ответ. Последующий: это настоящий кросс-браузер, и знаете ли вы какие-либо ссылки, которые его поддерживают? Я не беспокоюсь о блокировке вызова, я просто хочу убедиться, что между кодом обратного вызова и обычными событиями нет проблем синхронизации. – Karthik

+0

У JavaScript просто нет механизма для обработки нескольких потоков. Это само по себе является доказательством того, что оно не является многопоточным. Этот пост не является фактическим показателем, но поднимает превосходную точку зрения о том, что проблемы с нарезкой в ​​JS бессмысленны: http://damienkatz.net/2006/04/how_to_create_a.html –

+0

Если вы ищете Google для информации о потоке в JS, вы будете найти много блогов, которые говорят, что JS является потоковым, но все это основано на непонимании того, как работает JS-движок по отношению к его хосту (браузеру). –

2

Вспышка Внешние вызовы внешней линии выполняются синхронно, используя тот же поток обработки, что и основное приложение. Вызовы от Flash к JS обрабатываются так же, как привязка любого события в вашем приложении JS.

У меня есть blogged about, используя это в ваших интересах, когда это необходимо, хотя это чаще всего хлопот.

Вот некоторые другие ресурсы, относящиеся к этому факту: linklinklinklink

Я надеюсь, что помогает прояснить вещи.

+0

Некоторые ссылки сломаны, у меня есть проблема, которая может быть связана, не могли бы вы исправить ссылки? – HLL

+0

Я не уверен ни в одной из других ссылок, которые, возможно, истекли, но моя ссылка на блог изменилась на это: https://labs.tomasino.org/as3-synchronous-url-xml-loading.html –

Смежные вопросы