我写了一个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 上实现此目的的唯一方法是使用工作线程。