add initial_value argument to derived store

pull/2397/head
Conduitry 5 years ago
parent d4860ee444
commit 3170edb158

@ -293,13 +293,13 @@ const time = readable(new Date(), set => {
store = derived(a, callback: (a: any) => any)
```
```js
store = derived(a, callback: (a: any, set: (value: any) => void) => void)
store = derived(a, callback: (a: any, set: (value: any) => void) => void, initial_value: any)
```
```js
store = derived([a, ...b], callback: ([a: any, ...b: any[]]) => any)
```
```js
store = derived([a, ...b], callback: ([a: any, ...b: any[]], set: (value: any) => void) => void)
store = derived([a, ...b], callback: ([a: any, ...b: any[]], set: (value: any) => void) => void, initial_value: any)
```
---
@ -318,12 +318,14 @@ const doubled = derived(a, $a => $a * 2);
The callback can set a value asynchronously by accepting a second argument, `set`, and calling it when appropriate.
In this case, you can also pass a third argument to `derived` — the initial value of the derived store before `set` is first called.
```js
import { derived } from 'svelte/store';
const delayed = derived(a, ($a, set) => {
setTimeout(() => set($a), 1000);
});
}, 'one moment...');
```
---

@ -39,14 +39,14 @@ export function writable(value, start = noop) {
return { set, update, subscribe };
}
export function derived(stores, fn) {
export function derived(stores, fn, initial_value) {
const single = !Array.isArray(stores);
if (single) stores = [stores];
const auto = fn.length < 2;
let value = {};
return readable(undefined, set => {
return readable(initial_value, set => {
let inited = false;
const values = [];
@ -56,7 +56,7 @@ export function derived(stores, fn) {
if (pending) return;
const result = fn(single ? values[0] : values, set);
if (auto && (value !== (value = result))) set(result);
}
};
const unsubscribers = stores.map((store, i) => store.subscribe(
value => {

@ -142,10 +142,10 @@ describe('store', () => {
});
it('passes optional set function', () => {
const number = writable(0);
const number = writable(1);
const evens = derived(number, (n, set) => {
if (n % 2 === 0) set(n);
});
}, 0);
const values = [];
@ -153,17 +153,17 @@ describe('store', () => {
values.push(value);
});
number.set(1);
number.set(2);
number.set(3);
number.set(4);
number.set(5);
assert.deepEqual(values, [0, 2, 4]);
unsubscribe();
number.set(5);
number.set(6);
number.set(7);
number.set(8);
assert.deepEqual(values, [0, 2, 4]);
});

Loading…
Cancel
Save