Reactive Utilities

runWithOwner

编辑此页面
import { runWithOwner } from "solid-js"
import type { Owner } from "solid-js"
function runWithOwner<T>(owner: Owner, fn: (() => void) => T): T

在提供的所有者下执行给定的函数,而不是(也不影响)外部作用域的所有者。 默认情况下,由 createEffectcreateMemo 等创建的计算属于当前执行代码的所有者(即 getOwner 的返回值),因此特别是当它们的所有者被销毁时,这些计算也会被销毁。 调用 runWithOwner 提供了一种方法来将这个默认值覆盖为手动指定的所有者(通常是之前调用 getOwner 的返回值),从而能够更精确地控制计算何时被销毁。

拥有(正确的)所有者很重要,原因有两个:

  • 没有所有者的计算无法被清理。 例如,如果你在没有所有者的情况下调用 createEffect(比如在全局作用域中),这个效果将会一直运行下去,而不是在其所有者被销毁时被销毁。

  • useContext 通过向上遍历所有者树来获取最近的祖先提供的所需上下文。 因此,如果没有所有者,你将无法查找任何已提供的上下文(并且如果所有者错误,你可能会获取到错误的上下文)。

在任何所有者作用域之外进行响应式操作时,手动设置所有者特别有用。 特别是,异步计算(通过 async 函数或像 setTimeout 这样的回调)会失去其自动设置的所有者,因此在这些情况下,通过 getOwner 记住原始所有者并通过 runWithOwner 恢复它是必要的。 例如:

const owner = getOwner()
setTimeout(() => {
// 这个回调在没有所有者的情况下运行。
// 通过 runWithOwner 恢复所有者:
runWithOwner(owner, () => {
const foo = useContext(FooContext)
createEffect(() => {
console.log(foo)
})
})
}, 1000)

注意: 所有者并不是决定依赖追踪的因素,因此 runWithOwner 无法帮助异步函数中的追踪;在异步部分(例如第一个 await 之后)使用响应式状态不会被追踪为依赖项。

报告此页面问题