From 61f87fcde09b5478ff7a857030e854da41e58778 Mon Sep 17 00:00:00 2001 From: Ethan Zhang Date: Mon, 11 Nov 2024 19:08:42 +0800 Subject: [PATCH] fix(utils): make 'loadable' update immediate after resolve (#2790) * fix(utils): make 'loadable' update immediate after resolve * fix comments in #2790 --------- Co-authored-by: Daishi Kato --- src/vanilla/utils/loadable.ts | 21 +++++++++++---------- tests/vanilla/utils/loadable.test.ts | 12 ++++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/vanilla/utils/loadable.ts b/src/vanilla/utils/loadable.ts index 135bfccd56..c2f509a371 100644 --- a/src/vanilla/utils/loadable.ts +++ b/src/vanilla/utils/loadable.ts @@ -44,16 +44,17 @@ export function loadable(anAtom: Atom): Atom> { if (cached1) { return cached1 } - promise - .then( - (data) => { - loadableCache.set(promise, { state: 'hasData', data }) - }, - (error) => { - loadableCache.set(promise, { state: 'hasError', error }) - }, - ) - .finally(setSelf) + promise.then( + (data) => { + loadableCache.set(promise, { state: 'hasData', data }) + setSelf() + }, + (error) => { + loadableCache.set(promise, { state: 'hasError', error }) + setSelf() + }, + ) + const cached2 = loadableCache.get(promise) if (cached2) { return cached2 diff --git a/tests/vanilla/utils/loadable.test.ts b/tests/vanilla/utils/loadable.test.ts index 484343c8b4..1f4b165ff1 100644 --- a/tests/vanilla/utils/loadable.test.ts +++ b/tests/vanilla/utils/loadable.test.ts @@ -17,4 +17,16 @@ describe('loadable', () => { data: 'concrete', }) }) + + it('should get the latest loadable state after the promise resolves', async () => { + const store = createStore() + const asyncAtom = atom(Promise.resolve()) + const loadableAtom = loadable(asyncAtom) + + expect(store.get(loadableAtom)).toHaveProperty('state', 'loading') + + await store.get(asyncAtom) + + expect(store.get(loadableAtom)).toHaveProperty('state', 'hasData') + }) })