Is there some way to synchronously wait for or check for a new message in a web-worker?
I have a large complicated body of code (compiled LLVM from emscripten) that I cannot refactor around callbacks.
I need to make sure that code after a certain line doesn't execute until I receive and handle a message from the UI-thread. If I block with a while-loop, the event-loop never runs so I can't receive messages.
No, unfortunately. There was some discussion of adding a way to block on a message from the parent page, but it went nowhere. I'll see if I can dig up the relevant mailing list thread.
Can you break the sequence as follow without refactoring?
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)
}
}
The onmessage event will be blocked until the initial step execution stack is complete and the critical ui bits will only launch when and if the info is available.
A crude hack to do this could be to use a synchronous API, such as the FileSystem API, and use a temporary file as a synchronising mechanism.
In your example, the emscripten code could issue a synchronous read on a file, while the UI thread writes to the same file, effectively unblocking the worker.
来源:https://stackoverflow.com/questions/10590213/synchronously-wait-for-message-in-web-worker