我编写了一个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
,但我似乎无法使其发挥作用。
谢谢!
答案 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可能会有自己的线程支持:
答案 1 :(得分:2)
单独的异步执行不会将其从主线程中删除。你的意思是同时执行它。在Web上实现这一点的唯一方法是使用工作线程。