From: hxp971130 <32638462+LemonAppleMo@users.noreply.github.com> Date: Wed, 26 Jan 2022 09:59:18 +0000 (+0800) Subject: fix(subscriptions): allow removing subscriptions inside them (#990) X-Git-Tag: pinia@2.0.10~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=465d22292a0086eb610f5f83edd64a795eba329b;p=thirdparty%2Fvuejs%2Fpinia.git fix(subscriptions): allow removing subscriptions inside them (#990) Co-authored-by: Eduardo San Martin Morote --- diff --git a/packages/pinia/__tests__/subscriptions.spec.ts b/packages/pinia/__tests__/subscriptions.spec.ts index bfd36b39..cacd8c29 100644 --- a/packages/pinia/__tests__/subscriptions.spec.ts +++ b/packages/pinia/__tests__/subscriptions.spec.ts @@ -272,4 +272,33 @@ describe('Subscriptions', () => { store.$state ) }) + + it('subscribe once with patch', () => { + const spy1 = jest.fn() + const spy2 = jest.fn() + const store = useStore() + function once() { + const unsubscribe = store.$subscribe( + () => { + spy1() + unsubscribe() + }, + { flush: 'sync' } + ) + } + once() + store.$subscribe(spy2, { flush: 'sync' }) + expect(spy1).toHaveBeenCalledTimes(0) + expect(spy2).toHaveBeenCalledTimes(0) + store.$patch((state) => { + state.user = 'a' + }) + expect(spy1).toHaveBeenCalledTimes(1) + expect(spy2).toHaveBeenCalledTimes(1) + store.$patch((state) => { + state.user = 'b' + }) + expect(spy1).toHaveBeenCalledTimes(1) + expect(spy2).toHaveBeenCalledTimes(2) + }) }) diff --git a/packages/pinia/src/subscriptions.ts b/packages/pinia/src/subscriptions.ts index 5dfd2620..6dc46bb1 100644 --- a/packages/pinia/src/subscriptions.ts +++ b/packages/pinia/src/subscriptions.ts @@ -30,7 +30,7 @@ export function triggerSubscriptions( subscriptions: T[], ...args: Parameters ) { - subscriptions.forEach((callback) => { + subscriptions.slice().forEach((callback) => { callback(...args) }) }