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

时间:2018-06-07 01:11:58

标签: javascript c angular typescript 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,但我似乎无法使其发挥作用。

谢谢!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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