Ich habe eine C-Funktion geschrieben, die ich mit WebAssembly von Angular/TypeScript/JavaScript ausführen kann:
testWebAssembly() {
Module.ccall("aCFunction", null, [], []); // takes a few seconds to finish
}
Diese Funktion führt einige schwere mathematische Berechnungen durch und benötigt einige Sekunden, um abgeschlossen zu werden. Es wird ausgelöst, wenn ein Benutzer auf eine Schaltfläche klickt:
<button (click)="testWebAssembly()">Launch C function</button>
Ist es möglich, die Funktion so auszuführen, dass sie die Benutzeroberfläche der Webanwendung nicht blockiert?
Ich habe es versucht setTimeOut
/async
/Promise
aber ich scheine nicht in der Lage zu sein, es zum Laufen zu bringen.
Danke schön!
WebAssembly und JavaScript verwenden denselben Ausführungs-Thread, dh wenn Sie WebAssembly in JavaScript ausführen, wird Ihr JavaScript-Code angehalten und umgekehrt. In dieser Hinsicht ist es genau wie bei der Ausführung anderer nativer (dh vom Browser bereitgestellter) APIs aus Ihrem JavaScript-Code.
Eine Option, die Sie haben, besteht darin, Ihre WebAssembly in einem WebWorker auszuführen, indem Sie verwenden postMessage
um Nachrichten an Ihren Wasm-Code zu senden, der in einem anderen Thread ausgeführt wurde. Hier ist ein großartiges Beispiel, das ein Fraktal mit WebWorkers rendert:
https://www.reddit.com/r/rust/comments/8hdq5r/a_rust_javascript_web_workers_fractal_renderer/
In Zukunft wird WebAssembly wahrscheinlich eine eigene Unterstützung für Threading haben:
https://github.com/WebAssembly/threads
Die asynchrone Ausführung allein wird es nicht vom Hauptthread entfernen. Was Sie eigentlich meinen, ist die gleichzeitige Ausführung. Die einzige Möglichkeit, dies im Web zu erreichen, ist die Verwendung von Worker-Threads.
hast du schon mal an webworker gedacht?
– Jaromanda X
7. Juni 2018 um 1:29 Uhr