Skip to content

Commit 3f3803e

Browse files
authored
Merge pull request #2091 from sveltejs/gh-2072
add second argument to writable
2 parents 5c70456 + 9e8e99c commit 3f3803e

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

store.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ export function readable(start, value) {
3434
};
3535
}
3636

37-
export function writable(value) {
37+
export function writable(value, start = noop) {
38+
let stop;
3839
const subscribers = [];
3940

4041
function set(newValue) {
@@ -51,11 +52,13 @@ export function writable(value) {
5152
function subscribe(run, invalidate = noop) {
5253
const subscriber = [run, invalidate];
5354
subscribers.push(subscriber);
55+
if (subscribers.length === 1) stop = start() || noop;
5456
run(value);
5557

5658
return () => {
5759
const index = subscribers.indexOf(subscriber);
5860
if (index !== -1) subscribers.splice(index, 1);
61+
if (subscribers.length === 0) stop();
5962
};
6063
}
6164

test/store/index.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,27 @@ describe('store', () => {
2121

2222
assert.deepEqual(values, [0, 1, 2]);
2323
});
24+
25+
it('calls provided subscribe handler', () => {
26+
let called = 0;
27+
28+
const store = writable(0, () => {
29+
called += 1;
30+
return () => called -= 1;
31+
});
32+
33+
const unsubscribe1 = store.subscribe(() => {});
34+
assert.equal(called, 1);
35+
36+
const unsubscribe2 = store.subscribe(() => {});
37+
assert.equal(called, 1);
38+
39+
unsubscribe1();
40+
assert.equal(called, 1);
41+
42+
unsubscribe2();
43+
assert.equal(called, 0);
44+
});
2445
});
2546

2647
describe('readable', () => {

0 commit comments

Comments
 (0)