From 091410028e7538c834045d7eaab744dcf97eaa96 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Thu, 25 Apr 2019 23:09:27 -0400 Subject: [PATCH] fix subscribe implementation, add test for unsubscribing observables --- src/internal/utils.js | 11 ++--- .../observable-auto-subscribe/Nested.svelte | 5 ++ .../observable-auto-subscribe/_config.js | 49 +++++++++++++++++++ .../observable-auto-subscribe/main.svelte | 10 ++++ 4 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 test/runtime/samples/observable-auto-subscribe/Nested.svelte create mode 100644 test/runtime/samples/observable-auto-subscribe/_config.js create mode 100644 test/runtime/samples/observable-auto-subscribe/main.svelte diff --git a/src/internal/utils.js b/src/internal/utils.js index f773be639d..3ae62e375f 100644 --- a/src/internal/utils.js +++ b/src/internal/utils.js @@ -48,12 +48,11 @@ export function validate_store(store, name) { } export function subscribe(component, store, callback) { - let unsub = store.subscribe(callback); - // Prevent memory leaks for RxJS users. - if (unsub.unsubscribe) { - unsub = () => unsub.unsubscribe(); - } - component.$$.on_destroy.push(unsub); + const unsub = store.subscribe(callback); + + component.$$.on_destroy.push(unsub.unsubscribe + ? () => unsub.unsubscribe() + : unsub); } export function create_slot(definition, ctx, fn) { diff --git a/test/runtime/samples/observable-auto-subscribe/Nested.svelte b/test/runtime/samples/observable-auto-subscribe/Nested.svelte new file mode 100644 index 0000000000..5486ffe4ba --- /dev/null +++ b/test/runtime/samples/observable-auto-subscribe/Nested.svelte @@ -0,0 +1,5 @@ + + +

value: {$observable}

\ No newline at end of file diff --git a/test/runtime/samples/observable-auto-subscribe/_config.js b/test/runtime/samples/observable-auto-subscribe/_config.js new file mode 100644 index 0000000000..289a3b51c6 --- /dev/null +++ b/test/runtime/samples/observable-auto-subscribe/_config.js @@ -0,0 +1,49 @@ +const subscribers = []; + +let value = 'initial'; + +const observable = { + subscribe: fn => { + subscribers.push(fn); + + fn(value); + + return { + unsubscribe: () => { + const i = subscribers.indexOf(fn); + subscribers.splice(i, 1); + } + }; + } +}; + +export default { + props: { + observable, + visible: false + }, + + html: ``, + + async test({ assert, component, target }) { + assert.equal(subscribers.length, 0); + + component.visible = true; + + assert.equal(subscribers.length, 1); + assert.htmlEqual(target.innerHTML, ` +

value: initial

+ `); + + value = 42; + await subscribers.forEach(fn => fn(value)); + + assert.htmlEqual(target.innerHTML, ` +

value: 42

+ `); + + component.visible = false; + + assert.equal(subscribers.length, 0); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/observable-auto-subscribe/main.svelte b/test/runtime/samples/observable-auto-subscribe/main.svelte new file mode 100644 index 0000000000..ab29b4e72e --- /dev/null +++ b/test/runtime/samples/observable-auto-subscribe/main.svelte @@ -0,0 +1,10 @@ + + +{#if visible} + +{/if} \ No newline at end of file