Wie kann man beim Bereitstellen von Rückrufen für JavaScript mithilfe von Closures besser damit umgehen, dass sie nicht freigegeben werden? Der wasm-bindgen-Leitfaden schlägt die Verwendung vor .forget
, gibt jedoch zu, dass dies im Wesentlichen zu einem Speicherverlust führt.
Normalerweise speichern wir das Handle, damit es später zu einem geeigneten Zeitpunkt gelöscht wird. Derzeit möchten wir jedoch, dass es sich um einen globalen Handler handelt. Daher verwenden wir die
forget
Methode, um es zu löschen, ohne den Abschluss ungültig zu machen. Beachten Sie, dass dadurch Speicher in Rust verloren geht, daher sollte dies mit Bedacht erfolgen!
Es weist darauf hin, den Verschluss bis zu einem Zeitpunkt aufzubewahren, an dem es angebracht ist, ihn fallen zu lassen. In Alexcrichtons Antwort auf eine frühere Frage erwähnt er ...
[...] wenn es [...] nur einmal aufgerufen wird, können Sie
Rc
/ verwendenRefCell
, um dasClosure
Innere des Verschlusses selbst fallen zu lassen (unter Verwendung einiger innerer Mutabilitäts-Spielereien)
Ein Beispiel für diese Methode liefert er jedoch nicht.
Die Closure-Dokumentation enthält auch ein Beispiel für die Rückgabe des Verweises auf den Closure an den JavaScript-Kontext, damit dieser festlegen kann, wann der Verweis freigegeben werden soll.
Wenn wir hier fallen
cb
würden, würde eine Ausnahme ausgelöst, wenn das Intervall abgelaufen ist. Stattdessen wir zurückkehren unseren Griff zurück in JS so kann JS entscheiden , wann das Intervall abzubrechen und den Verschluss freizugeben.
Ich würde mir auch vorstellen, dass es Möglichkeiten gibt, Funktionen wie Lebensdauern oder das #[wasm_bindgen]
Makro für eine öffentliche Funktion zu verwenden, um dieses Problem zu vermeiden, aber ich habe Probleme, herauszufinden, wie es so gemacht wird.
Meine Frage ist, welche Alternativen zur Verwendung .forget
mit Verschlüssen bestehen, die von Rust an JavaScript zurückgegeben werden. Kann ich bitte einige einfache Beispiele für jede verwendete Option sehen?