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

and*_*eas 7 javascript c typescript webassembly angular

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

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

此函数需要进行大量的数学计算,并且需要几秒钟才能完成。用户单击按钮时将触发:

<button (click)="testWebAssembly()">Launch C function</button>
Run Code Online (Sandbox Code Playgroud)

是否可以执行该功能,使其不阻止Web应用程序的UI?

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

谢谢!

And*_*erg 7

单独的异步执行不会将其从主线程中分离出来。您实际上的意思是同时执行它。在 Web 上实现这一点的唯一方法是使用工作线程。


Col*_*inE 7

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