Синхронно ждать сообщения в веб-рабочем
Есть ли способ синхронного ожидания или проверки нового сообщения в веб-работнике?
У меня большой сложный код (скомпилированный 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 может выдавать синхронное чтение в файле, тогда как поток пользовательского интерфейса записывает в тот же файл, эффективно разблокируя рабочего.