Вопрос по javascript – Синхронно ждать сообщения в Web-Worker

15

Есть ли способ синхронно ждать или проверять новое сообщение в веб-работнике?

У меня большой сложный код (скомпилированный LLVM из emscripten), который я не могу реорганизовать с помощью обратных вызовов.

Мне нужно убедиться, что код после определенной строки не будет выполняться, пока я не получу и не обработаю сообщение из потока пользовательского интерфейса. Если я блокирую с помощью цикла while, цикл обработки событий никогда не запускается, поэтому я не могу получать сообщения.

Было бы решение вашей проблемы, если бы ECMAScript был таким же богатым языком, как Scheme, с егоcall-with-continuation, Это позволит вам перехватить текущее продолжение и вызвать его снова в вашемonmessage обработчик. Marc

Ваш Ответ

3   ответа
1

ринга?

wrk.onmessage = function(e) {
    if (e.data.step === 'initial input') {
        doInitialWork(e.data.inputs)
    } else if (e.data.step === 'ui input') {
        doTheRest(e.data.uiData)
    }
}

Событие onmessage будет заблокировано до тех пор, пока не будет завершен стек выполнения начального шага, а критические биты пользовательского интерфейса будут запускаться только тогда, когда информация доступна.

0

такого как API-интерфейс FileSystem, и использование временного файла в качестве механизма синхронизации.

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

0

к сожалению. Были некоторые обсуждения о добавлении способа блокировать сообщение с родительской страницы, но это ни к чему не привело. Я посмотрю, смогу ли я найти соответствующую ветку списка рассылки.

Похожие вопросы