runWithOwner
编辑此页面import { runWithOwner } from "solid-js"import type { Owner } from "solid-js"
function runWithOwner<T>(owner: Owner, fn: (() => void) => T): T
在提供的所有者下执行给定的函数,而不是(也不影响)外部作用域的所有者。
默认情况下,由 createEffect
、createMemo
等创建的计算属于当前执行代码的所有者(即 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
之后)使用响应式状态不会被追踪为依赖项。