В каком потоке выполняется код JavaScript, вызванный из Flash? - PullRequest
16 голосов
/ 06 февраля 2009

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

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

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

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

function doActualWork() {
    // blah blah blah
}

Ответы [ 2 ]

10 голосов
/ 06 февраля 2009

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

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

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

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

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

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

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

2 голосов
/ 18 января 2012

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

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

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

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

...