是否可以异步运行 WebAssembly 代码?



我写了一个C函数,我可以使用WebAssembly从Angular/TypeScript/JavaScript执行:

testWebAssembly() {
Module.ccall("aCFunction", null, [], []); // takes a few seconds to finish
}

此函数执行一些繁重的数学计算,需要几秒钟才能完成。当用户单击按钮时触发它:

<button (click)="testWebAssembly()">Launch C function</button>

是否可以执行该函数,使其不会阻塞 Web 应用程序的 UI?

我尝试了setTimeOut/async/Promise,但我似乎无法使其工作。

谢谢!

WebAssembly 和 JavaScript 共享相同的执行线程,即当您从 JavaScript 中执行 WebAssembly 时,您的 JavaScript 代码会停止,反之亦然。在这方面,它就像从您的 JavaScript 代码中执行任何其他本机(即浏览器提供的(API。

您有一个选择是在 WebWorker 中运行 WebAssembly,使用postMessage将消息发送到在不同线程中执行的 wasm 代码。这里有一个很好的例子,它使用 WebWorkers 渲染分形:

https://www.reddit.com/r/rust/comments/8hdq5r/a_rust_javascript_web_workers_fractal_renderer/

将来,WebAssembly 可能会有自己的线程支持:

https://github.com/WebAssembly/threads

仅异步执行不会将其从主线程中移除。你实际上的意思是并发执行它。在 Web 上实现此目的的唯一方法是使用工作线程。

最新更新