Когда вы предоставляете обратные вызовы для JavaScript с использованием Закрытия , что является лучшим способом избежать их освобождения? Руководство по wasm-bindgen предлагает использовать .forget
, но допускает, что это, по сути, утечка памяти.
Обычно мы сохраняем дескриптор, чтобы позже его уронили в подходящее время но сейчас мы хотим, чтобы это был глобальный обработчик, поэтому мы используем метод forget
, чтобы удалить его, не делая недействительным замыкание. Обратите внимание, что это утечка памяти в Rust, поэтому это следует делать разумно!
Это намекает на сохранение закрытия до тех пор, пока его не удастся сбросить. В ответе alexcrichton на на предыдущий вопрос он упоминает ...
[...], если он [...] вызывается только один раз, затем вы можете использовать Rc
/ RefCell
, чтобы опустить Closure
внутри самого затвора (используя некоторые внутренние изменчивые махинации)
Но он не приводит пример этого метода.
В документации Закрытия также приведен пример возврата ссылки на замыкание в контекст JavaScript, чтобы он мог обрабатывать, когда освобождать ссылку.
Если бы мы здесь отбросили cb
, это вызвало бы исключение, возникающее при истечении интервала. Вместо этого мы возвращаем наш дескриптор обратно в JS, поэтому JS может решить, когда отменить интервал и освободить закрытие.
Я бы также предположил, что есть способы чтобы избежать этой проблемы, используйте такие функции, как время жизни или макрос #[wasm_bindgen]
в функции publi c, но мне сложно понять, как это сделать.
Вопрос в том, что Есть ли альтернативы использованию .forget
с замыканиями, которые передаются обратно в JavaScript из Rust, и могу ли я увидеть несколько простых примеров каждого используемого параметра?