Синхронно ждать сообщения в веб-рабочем

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

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

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

Ответы

Ответ 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 будет заблокировано до тех пор, пока не будет завершен стек начального шага, а критические биты ui будут запускаться только тогда, когда и если информация будет доступна.

Ответ 2

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

Ответ 3

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

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