Skip to content

Commit db27288

Browse files
committed
WIP
1 parent bd83eeb commit db27288

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

packages/svelte/src/compiler/phases/3-transform/client/visitors/AwaitExpression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export function AwaitExpression(node, context) {
2424
// in dev, note which values are read inside a reactive expression,
2525
// but don't track them
2626
else if (dev && !is_ignored(node, 'await_reactivity_loss')) {
27-
return b.call(b.await(b.call('$.save', argument, b.false)));
27+
return b.call(b.await(b.call('$.track_reactivity_loss', argument, b.false)));
2828
}
2929

3030
return argument === node.argument ? node : { ...node, argument };

packages/svelte/src/internal/client/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export {
9898
props_id,
9999
with_script
100100
} from './dom/template.js';
101-
export { save } from './reactivity/async.js';
101+
export { save, track_reactivity_loss } from './reactivity/async.js';
102102
export { flushSync as flush, suspend } from './reactivity/batch.js';
103103
export {
104104
async_derived,

packages/svelte/src/internal/client/reactivity/async.js

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -65,33 +65,21 @@ export function flatten(sync, async, fn) {
6565

6666
/**
6767
* Captures the current effect context so that we can restore it after
68-
* some asynchronous work has happened if `track` is true (so that e.g.
69-
* `await a + b` causes `b` to be registered as a dependency).
70-
*
71-
* If `track` is false, we just take a note of which async derived
72-
* brought us here, so that we can emit a `async_reactivity_loss`
73-
* warning when it's appropriate to do so.
74-
*
75-
* @param {boolean} track
68+
* some asynchronous work has happened (so that e.g. `await a + b`
69+
* causes `b` to be registered as a dependency).
7670
*/
77-
export function capture(track = true) {
71+
function capture() {
7872
var previous_effect = active_effect;
7973
var previous_reaction = active_reaction;
8074
var previous_component_context = component_context;
8175

82-
if (DEV && !track) {
83-
var previous_async_effect = current_async_effect;
84-
}
85-
8676
return function restore() {
87-
if (track) {
88-
set_active_effect(previous_effect);
89-
set_active_reaction(previous_reaction);
90-
set_component_context(previous_component_context);
91-
}
77+
set_active_effect(previous_effect);
78+
set_active_reaction(previous_reaction);
79+
set_component_context(previous_component_context);
9280

9381
if (DEV) {
94-
set_from_async_derived(track ? null : previous_async_effect);
82+
set_from_async_derived(null);
9583
}
9684

9785
// prevent the active effect from outstaying its welcome
@@ -106,11 +94,10 @@ export function capture(track = true) {
10694
* `await a + b` becomes `(await $.save(a))() + b`
10795
* @template T
10896
* @param {Promise<T>} promise
109-
* @param {boolean} [track]
11097
* @returns {Promise<() => T>}
11198
*/
112-
export async function save(promise, track = true) {
113-
var restore = capture(track);
99+
export async function save(promise) {
100+
var restore = capture();
114101
var value = await promise;
115102

116103
return () => {
@@ -119,6 +106,23 @@ export async function save(promise, track = true) {
119106
};
120107
}
121108

109+
/**
110+
* Reset `current_async_effect` after the `promise` resolves, so
111+
* that we can emit `await_reactivity_loss` warnings
112+
* @template T
113+
* @param {Promise<T>} promise
114+
* @returns {Promise<() => T>}
115+
*/
116+
export async function track_reactivity_loss(promise) {
117+
var previous_async_effect = current_async_effect;
118+
var value = await promise;
119+
120+
return () => {
121+
set_from_async_derived(previous_async_effect);
122+
return value;
123+
};
124+
}
125+
122126
function unset_context() {
123127
set_active_effect(null);
124128
set_active_reaction(null);

0 commit comments

Comments
 (0)