From 0f65b6cc9d805265094a90d9d0dddc8c30a57d32 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 21 Aug 2019 14:37:57 -0400 Subject: [PATCH] set context in await blocks - fixes #2443 --- src/runtime/internal/await_block.ts | 6 ++++++ src/runtime/internal/lifecycle.ts | 2 +- test/runtime/samples/context-in-await/Child.svelte | 6 ++++++ test/runtime/samples/context-in-await/_config.js | 13 +++++++++++++ test/runtime/samples/context-in-await/main.svelte | 14 ++++++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 test/runtime/samples/context-in-await/Child.svelte create mode 100644 test/runtime/samples/context-in-await/_config.js create mode 100644 test/runtime/samples/context-in-await/main.svelte diff --git a/src/runtime/internal/await_block.ts b/src/runtime/internal/await_block.ts index 3834ff7c31..4037caa98e 100644 --- a/src/runtime/internal/await_block.ts +++ b/src/runtime/internal/await_block.ts @@ -1,6 +1,7 @@ import { assign, is_promise } from './utils'; import { check_outros, group_outros, transition_in, transition_out } from './transitions'; import { flush } from './scheduler'; +import { get_current_component, set_current_component } from './lifecycle'; export function handle_promise(promise, info) { const token = info.token = {}; @@ -40,10 +41,15 @@ export function handle_promise(promise, info) { } if (is_promise(promise)) { + const current_component = get_current_component(); promise.then(value => { + set_current_component(current_component); update(info.then, 1, info.value, value); + set_current_component(null); }, error => { + set_current_component(current_component); update(info.catch, 2, info.error, error); + set_current_component(null); }); // if we previously had a then/catch block, destroy it diff --git a/src/runtime/internal/lifecycle.ts b/src/runtime/internal/lifecycle.ts index d659fd2e4a..0ca3e4306d 100644 --- a/src/runtime/internal/lifecycle.ts +++ b/src/runtime/internal/lifecycle.ts @@ -6,7 +6,7 @@ export function set_current_component(component) { current_component = component; } -function get_current_component() { +export function get_current_component() { if (!current_component) throw new Error(`Function called outside component initialization`); return current_component; } diff --git a/test/runtime/samples/context-in-await/Child.svelte b/test/runtime/samples/context-in-await/Child.svelte new file mode 100644 index 0000000000..1227c2857d --- /dev/null +++ b/test/runtime/samples/context-in-await/Child.svelte @@ -0,0 +1,6 @@ + + +

Context value: {num}

\ No newline at end of file diff --git a/test/runtime/samples/context-in-await/_config.js b/test/runtime/samples/context-in-await/_config.js new file mode 100644 index 0000000000..221f5fbcca --- /dev/null +++ b/test/runtime/samples/context-in-await/_config.js @@ -0,0 +1,13 @@ +export default { + html: ` +

...waiting

+ `, + + async test({ assert, component, target }) { + await component.promise; + + assert.htmlEqual(target.innerHTML, ` +

Context value: 123

+ `); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/context-in-await/main.svelte b/test/runtime/samples/context-in-await/main.svelte new file mode 100644 index 0000000000..4f251f0870 --- /dev/null +++ b/test/runtime/samples/context-in-await/main.svelte @@ -0,0 +1,14 @@ + + +{#await promise} +

...waiting

+{:then} + +{/await} \ No newline at end of file