UNPKG

rvx

Version:

A signal based rendering library

156 lines (119 loc) 2.82 kB
# Side Effect Isolation The [signal](./signals.md) and [lifecycle](./lifecycle.md) APIs can cause side effects such as tracking a signal access or registering a teardown hook. The `isolate` function can be used to run arbitrary code in isolation from signal access tracking and the current lifecycle. === "JSX" ```jsx import { isolate } from "rvx"; isolate(() => { // Some code with side effects... }); ``` === "No Build" ```jsx import { isolate } from "./rvx.js"; isolate(() => { // Some code with side effects... }); ``` ## Lifecycle Teardown hooks are leaked as if [`teardown`](./lifecycle.md#teardown) was called outside of any context: === "JSX" ```jsx import { capture, teardown, isolate } from "rvx"; capture(() => { // This will be captured: teardown(() => {}); isolate(() => { // This will leak: teardown(() => {}); }); }); ``` === "No Build" ```jsx import { capture, teardown, isolate } from "./rvx.js"; capture(() => { // This will be captured: teardown(() => {}); isolate(() => { // This will leak: teardown(() => {}); }); }); ``` ## Signals Signal accesses are not tracked as if the signal was accessed outside of any observer. === "JSX" ```jsx import { isolate, watch } from "rvx"; watch(() => { // This is tracked: signalA.access(); isolate(() => { // This is ignored: signalB.access(); }); }); ``` === "No Build" ```jsx import { isolate, watch } from "./rvx.js"; watch(() => { // This is tracked: signalA.access(); isolate(() => { // This is ignored: signalB.access(); }); }); ``` To only isolate signal accesses, use [`untrack`](./signals.md#untrack) instead. ## Non Isolated APIs [Batches](./signals.md#batch) are not isolated as this could lead to inconsistent signal access tracking: ```jsx import { batch, isolate } from "rvx"; batch(() => { // This is part of the batch: a.value++; isolate(() => { // This is also part of the batch: b.value++; }); }); ``` The `isolate` function is transparent to all [contexts](./context.md) for performance reasons: === "JSX" ```jsx import { Context, isolate } from "rvx"; const EXAMPLE = new Context(42); EXAMPLE.provide(77, () => { isolate(() => { EXAMPLE.value; // 77 }); }); ``` === "No Build" ```jsx import { Context, isolate } from "./rvx.js"; const EXAMPLE = new Context(42); EXAMPLE.provide(77, () => { isolate(() => { EXAMPLE.value; // 77 }); }); ``` In case you also need to isolate all contexts, `isolate` can be combined with `Context.isolate`: === "JSX" ```jsx import { Context, isolate } from "rvx"; isolate(Context.isolate, [], () => { // ... }); ``` === "No Build" ```jsx import { Context, isolate } from "./rvx.js"; isolate(Context.isolate, [], () => { // ... }); ```