store subscribers shouldn't get the initial undefined value

before this, an empty, uninitialized store would emit an `undefined`
value, even before any value is set. this is quite unexpected and not
the same behaviour as rxjs (for example).

you can still explicitly create a store with undefined with
`writeable(undefined)` or `readable(undefined)`

Previously:
```
> var store = require('./store');
> var w = store.writable();
> w.subscribe(v=>console.log('v:', v));
v: undefined
```

After this commit:
```
> var store = require('./store');
> var w = store.writable();
> w.subscribe(v=>console.log('v:', v));
> w.set('test');
v: test
```
pull/7075/head
Дамјан Георгиевски 5 years ago
parent 6f2ebaa76d
commit 691944e9f8

@ -65,8 +65,11 @@ export function writable<T>(value?: T, start: StartStopNotifier<T> = noop): Writ
let stop: Unsubscriber; let stop: Unsubscriber;
const subscribers: Set<SubscribeInvalidateTuple<T>> = new Set(); const subscribers: Set<SubscribeInvalidateTuple<T>> = new Set();
let runOnSubscribe = value !== undefined;
function set(new_value: T): void { function set(new_value: T): void {
if (safe_not_equal(value, new_value)) { if (safe_not_equal(value, new_value)) {
runOnSubscribe = true;
value = new_value; value = new_value;
if (stop) { // store is ready if (stop) { // store is ready
const run_queue = !subscriber_queue.length; const run_queue = !subscriber_queue.length;
@ -94,7 +97,7 @@ export function writable<T>(value?: T, start: StartStopNotifier<T> = noop): Writ
if (subscribers.size === 1) { if (subscribers.size === 1) {
stop = start(set) || noop; stop = start(set) || noop;
} }
run(value); if (runOnSubscribe) run(value);
return () => { return () => {
subscribers.delete(subscriber); subscribers.delete(subscriber);

@ -22,7 +22,7 @@ describe('store', () => {
assert.deepEqual(values, [0, 1, 2]); assert.deepEqual(values, [0, 1, 2]);
}); });
it('creates an undefined writable store', () => { it('creates an empty writable store', () => {
const store = writable(); const store = writable();
const values = []; const values = [];
@ -32,9 +32,23 @@ describe('store', () => {
unsubscribe(); unsubscribe();
assert.deepEqual(values, [undefined]); assert.deepEqual(values, []);
}); });
it('creates a null writable store', () => {
const store = writable(null);
const values = [];
const unsubscribe = store.subscribe(value => {
values.push(value);
});
unsubscribe();
assert.deepEqual(values, [null]);
});
it('calls provided subscribe handler', () => { it('calls provided subscribe handler', () => {
let called = 0; let called = 0;
@ -128,7 +142,7 @@ describe('store', () => {
assert.deepEqual(values, [0, 1, 2]); assert.deepEqual(values, [0, 1, 2]);
}); });
it('creates an undefined readable store', () => { it('creates an empty readable store', () => {
const store = readable(); const store = readable();
const values = []; const values = [];
@ -138,7 +152,7 @@ describe('store', () => {
unsubscribe(); unsubscribe();
assert.deepEqual(values, [undefined]); assert.deepEqual(values, []);
}); });
it('creates a readable store without updater', () => { it('creates a readable store without updater', () => {

Loading…
Cancel
Save