diff --git a/src/runtime/internal/ssr.ts b/src/runtime/internal/ssr.ts index 09f9f07ab7..c98427ae54 100644 --- a/src/runtime/internal/ssr.ts +++ b/src/runtime/internal/ssr.ts @@ -114,9 +114,15 @@ export function create_ssr_component(fn) { }; } +/** + * Get the current value from a store by subscribing and immediately unsubscribing. + * @param store readable + */ export function get_store_value(store: Readable): T | undefined { let value; - store.subscribe(_ => value = _)(); + const unsubscribe: any = store.subscribe(_ => value = _); + if (unsubscribe.unsubscribe) unsubscribe.unsubscribe(); + else unsubscribe(); return value; } diff --git a/src/runtime/store/index.ts b/src/runtime/store/index.ts index 6e55d010ce..c85163003f 100644 --- a/src/runtime/store/index.ts +++ b/src/runtime/store/index.ts @@ -1,4 +1,5 @@ import { run_all, noop, safe_not_equal, is_function } from 'svelte/internal'; +export { get_store_value as get } from 'svelte/internal'; /** Callback to inform of a value updates. */ type Subscriber = (value: T) => void; @@ -188,14 +189,4 @@ export function derived( }; } }; -} - -/** - * Get the current value from a store by subscribing and immediately unsubscribing. - * @param store readable - */ -export function get(store: Readable): T { - let value: T | undefined; - store.subscribe((_: T) => value = _)(); - return value as T; -} +} \ No newline at end of file diff --git a/test/store/index.ts b/test/store/index.ts index bbfe7099b4..73ffbb1de8 100644 --- a/test/store/index.ts +++ b/test/store/index.ts @@ -329,5 +329,18 @@ describe('store', () => { const store = readable(42, () => { }); assert.equal(get(store), 42); }); + + it('works with RxJS-style observables', () => { + const observable = { + subscribe(fn) { + fn(42); + return { + unsubscribe: () => {} + } + } + }; + + assert.equal(get(observable), 42); + }); }); });