Skip to content

Commit 7b65921

Browse files
committed
Revert "feature: Error handling and circular dependency management. (#19)"
This reverts commit 3f7ff12.
1 parent 2c72497 commit 7b65921

File tree

3 files changed

+10
-104
lines changed

3 files changed

+10
-104
lines changed

force-app/lwc/signals/core.js

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ const context = [];
66
function _getCurrentObserver() {
77
return context[context.length - 1];
88
}
9-
const UNSET = Symbol("UNSET");
10-
const COMPUTING = Symbol("COMPUTING");
11-
const ERRORED = Symbol("ERRORED");
12-
const READY = Symbol("READY");
139
/**
1410
* Creates a new effect that will be executed immediately and whenever
1511
* any of the signals it reads from change.
@@ -30,34 +26,16 @@ const READY = Symbol("READY");
3026
* @param fn The function to execute
3127
*/
3228
function $effect(fn) {
33-
const effectNode = {
34-
error: null,
35-
state: UNSET
36-
};
3729
const execute = () => {
38-
if (effectNode.state === COMPUTING) {
39-
throw new Error("Circular dependency detected");
40-
}
4130
context.push(execute);
4231
try {
43-
effectNode.state = COMPUTING;
4432
fn();
45-
effectNode.error = null;
46-
effectNode.state = READY;
4733
} finally {
4834
context.pop();
4935
}
5036
};
5137
execute();
5238
}
53-
function computedGetter(node) {
54-
if (node.state === ERRORED) {
55-
console.log("throwing error", node.error);
56-
throw node.error;
57-
}
58-
console.log("all good");
59-
return node.signal.readOnly;
60-
}
6139
/**
6240
* Creates a new computed value that will be updated whenever the signals
6341
* it reads from change. Returns a read-only signal that contains the
@@ -74,26 +52,13 @@ function computedGetter(node) {
7452
* @param fn The function that returns the computed value.
7553
*/
7654
function $computed(fn) {
77-
const computedNode = {
78-
signal: $signal(undefined),
79-
error: null,
80-
state: UNSET
81-
};
55+
// The initial value is undefined, as it will be computed
56+
// when the effect runs for the first time
57+
const computedSignal = $signal(undefined);
8258
$effect(() => {
83-
if (computedNode.state === COMPUTING) {
84-
throw new Error("Circular dependency detected");
85-
}
86-
try {
87-
computedNode.state = COMPUTING;
88-
computedNode.signal.value = fn();
89-
computedNode.error = null;
90-
computedNode.state = READY;
91-
} catch (error) {
92-
computedNode.state = ERRORED;
93-
computedNode.error = error;
94-
}
59+
computedSignal.value = fn();
9560
});
96-
return computedGetter(computedNode);
61+
return computedSignal.readOnly;
9762
}
9863
class UntrackedState {
9964
constructor(value) {

src/lwc/signals/__tests__/effect.test.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,4 @@ describe("effects", () => {
1414
signal.value = 1;
1515
expect(effectTracker).toBe(1);
1616
});
17-
18-
test("throw an error when a circular dependency is detected", () => {
19-
expect(() => {
20-
const signal = $signal(0);
21-
$effect(() => {
22-
signal.value = signal.value++;
23-
});
24-
}).toThrow();
25-
});
2617
});

src/lwc/signals/core.ts

Lines changed: 5 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,6 @@ function _getCurrentObserver(): VoidFunction | undefined {
1919
return context[context.length - 1];
2020
}
2121

22-
const UNSET = Symbol("UNSET");
23-
const COMPUTING = Symbol("COMPUTING");
24-
const ERRORED = Symbol("ERRORED");
25-
const READY = Symbol("READY");
26-
27-
interface EffectNode {
28-
error: unknown;
29-
state: symbol;
30-
}
31-
3222
/**
3323
* Creates a new effect that will be executed immediately and whenever
3424
* any of the signals it reads from change.
@@ -49,22 +39,10 @@ interface EffectNode {
4939
* @param fn The function to execute
5040
*/
5141
function $effect(fn: VoidFunction): void {
52-
const effectNode: EffectNode = {
53-
error: null,
54-
state: UNSET
55-
}
56-
5742
const execute = () => {
58-
if (effectNode.state === COMPUTING) {
59-
throw new Error("Circular dependency detected");
60-
}
61-
6243
context.push(execute);
6344
try {
64-
effectNode.state = COMPUTING;
6545
fn();
66-
effectNode.error = null;
67-
effectNode.state = READY;
6846
} finally {
6947
context.pop();
7048
}
@@ -73,22 +51,8 @@ function $effect(fn: VoidFunction): void {
7351
execute();
7452
}
7553

76-
interface ComputedNode<T> {
77-
signal: Signal<T | undefined>;
78-
error: unknown;
79-
state: symbol;
80-
}
81-
8254
type ComputedFunction<T> = () => T;
8355

84-
function computedGetter<T>(node: ComputedNode<T>) {
85-
if (node.state === ERRORED) {
86-
throw node.error;
87-
}
88-
89-
return node.signal.readOnly as ReadOnlySignal<T>;
90-
}
91-
9256
/**
9357
* Creates a new computed value that will be updated whenever the signals
9458
* it reads from change. Returns a read-only signal that contains the
@@ -105,29 +69,15 @@ function computedGetter<T>(node: ComputedNode<T>) {
10569
* @param fn The function that returns the computed value.
10670
*/
10771
function $computed<T>(fn: ComputedFunction<T>): ReadOnlySignal<T> {
108-
const computedNode: ComputedNode<T> = {
109-
signal: $signal<T | undefined>(undefined),
110-
error: null,
111-
state: UNSET
112-
};
72+
// The initial value is undefined, as it will be computed
73+
// when the effect runs for the first time
74+
const computedSignal: Signal<T | undefined> = $signal(undefined);
11375

11476
$effect(() => {
115-
if (computedNode.state === COMPUTING) {
116-
throw new Error("Circular dependency detected");
117-
}
118-
119-
try {
120-
computedNode.state = COMPUTING;
121-
computedNode.signal.value = fn();
122-
computedNode.error = null;
123-
computedNode.state = READY;
124-
} catch (error) {
125-
computedNode.state = ERRORED;
126-
computedNode.error = error;
127-
}
77+
computedSignal.value = fn();
12878
});
12979

130-
return computedGetter(computedNode);
80+
return computedSignal.readOnly as ReadOnlySignal<T>;
13181
}
13282

13383
type StorageFn<T> = (value: T) => State<T> & { [key: string]: unknown };

0 commit comments

Comments
 (0)