是否可以 运行 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 可能会有自己的线程支持:
我已经编写了一个 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 可能会有自己的线程支持: