Существует одно простое правило с такими функциями жизненного цикла, как onDestroy
: они должны вызываться во время инициализации компонента, то есть они должны вызываться синхронно в теге <script>
компонента.
<script>
import { onDestroy } from 'svelte'
onDestroy(..) // ok
{
onDestroy(..) // ok
}
(() => {
onDestroy(..) // ok
})()
const fn = callback => {
onDestroy(callback)
}
fn() // ok
setTimeout(() => {
onDestroy(..) // NOT OK !!!
fn() // NOT OK
})
</script>
Что Важно то, когда выполняется вызов, а не где в коде он находится. Обратный вызов жизненного цикла будет прикреплен к компоненту, который в настоящее время инициализируется, независимо от того, откуда исходит вызов.
Вы можете поместить onDestroy
в функцию, если хотите, это просто означает, что пользователь этой функции должен будет вызовите его во время инициализации компонента, и обратный вызов будет запущен, когда этот компонент будет уничтожен.
В примере, который вы связали, контекст используется как транспорт для функции который содержит onDestroy
. Контекст также должен быть разрешен синхронно во время фазы инициализации компонента, так что все в порядке. Компонент получает функцию из контекста, вызывает ее немедленно, и функция может зарегистрировать некоторую очистку компонента без ведома компонента. Хорошая инкапсуляция.