@@ -47,57 +47,58 @@ export function unwrap<Value, Args extends unknown[], Result, PendingValue>(
4747 PromiseLike < unknown > ,
4848 Awaited < Value >
4949 > ( )
50- const refreshAtom = atom ( 0 )
50+ const refreshAtom = atom ( [ ( ) => { } , 0 ] as [ ( ) => void , number ] )
51+ refreshAtom . unstable_onInit = ( store ) => {
52+ store . set ( refreshAtom , ( [ , c ] ) => [
53+ ( ) => store . set ( refreshAtom , ( [ f , c ] ) => [ f , c + 1 ] ) ,
54+ c ,
55+ ] )
56+ }
5157
5258 if ( import . meta. env ?. MODE !== 'production' ) {
5359 refreshAtom . debugPrivate = true
5460 }
5561
56- const promiseAndValueAtom : WritableAtom < PromiseAndValue , [ ] , void > & {
62+ const promiseAndValueAtom : Atom < PromiseAndValue > & {
5763 init ?: undefined
58- } = atom (
59- ( get , { setSelf } ) => {
60- get ( refreshAtom )
61- let prev : PromiseAndValue | undefined
62- try {
63- prev = get ( promiseAndValueAtom ) as PromiseAndValue | undefined
64- } catch {
65- // ignore previous errors to avoid getting stuck in error state
66- }
67- const promise = get ( anAtom )
68- if ( ! isPromiseLike ( promise ) ) {
69- return { v : promise as Awaited < Value > }
70- }
71- if ( promise !== prev ?. p ) {
72- promise . then (
73- ( v ) => {
74- promiseResultCache . set ( promise , v as Awaited < Value > )
75- setSelf ( )
76- } ,
77- ( e ) => {
78- promiseErrorCache . set ( promise , e )
79- setSelf ( )
80- } ,
81- )
82- }
83- if ( promiseErrorCache . has ( promise ) ) {
84- throw promiseErrorCache . get ( promise )
85- }
86- if ( promiseResultCache . has ( promise ) ) {
87- return {
88- p : promise ,
89- v : promiseResultCache . get ( promise ) as Awaited < Value > ,
90- }
64+ } = atom ( ( get ) => {
65+ const [ triggerRefresh ] = get ( refreshAtom )
66+ let prev : PromiseAndValue | undefined
67+ try {
68+ prev = get ( promiseAndValueAtom ) as PromiseAndValue | undefined
69+ } catch {
70+ // ignore previous errors to avoid getting stuck in error state
71+ }
72+ const promise = get ( anAtom )
73+ if ( ! isPromiseLike ( promise ) ) {
74+ return { v : promise as Awaited < Value > }
75+ }
76+ if ( promise !== prev ?. p ) {
77+ promise . then (
78+ ( v ) => {
79+ promiseResultCache . set ( promise , v as Awaited < Value > )
80+ triggerRefresh ( )
81+ } ,
82+ ( e ) => {
83+ promiseErrorCache . set ( promise , e )
84+ triggerRefresh ( )
85+ } ,
86+ )
87+ }
88+ if ( promiseErrorCache . has ( promise ) ) {
89+ throw promiseErrorCache . get ( promise )
90+ }
91+ if ( promiseResultCache . has ( promise ) ) {
92+ return {
93+ p : promise ,
94+ v : promiseResultCache . get ( promise ) as Awaited < Value > ,
9195 }
92- if ( prev && 'v' in prev ) {
93- return { p : promise , f : fallback ( prev . v ) , v : prev . v }
94- }
95- return { p : promise , f : fallback ( ) }
96- } ,
97- ( _get , set ) => {
98- set ( refreshAtom , ( c ) => c + 1 )
99- } ,
100- )
96+ }
97+ if ( prev && 'v' in prev ) {
98+ return { p : promise , f : fallback ( prev . v ) , v : prev . v }
99+ }
100+ return { p : promise , f : fallback ( ) }
101+ } )
101102 // HACK to read PromiseAndValue atom before initialization
102103 promiseAndValueAtom . init = undefined
103104
0 commit comments