Какой поток вызывает JavaScript-код из Flash?

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

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

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

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

function doActualWork() {
    // blah blah blah
}

Ответы

Ответ 1

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

Обновление для награды:

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

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

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

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

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

Ответ 2

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

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

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

Я надеюсь, что это поможет прояснить ситуацию.