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

Is it possible to run WebAssembly code async?

我已经编写了一个 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,但我似乎无法让它工作。

谢谢!

单独的异步执行不会将其从主线程中移除。你真正的意思是同时执行它。在 Web 上实现此目的的唯一方法是使用工作线程。

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