@@ -108,7 +108,12 @@ describe('ReactDOMFizzSuspenseList', () => {
108
108
109
109
function createAsyncText ( text ) {
110
110
let resolved = false ;
111
+ let error = undefined ;
111
112
const Component = function ( ) {
113
+ if ( error !== undefined ) {
114
+ Scheduler . log ( 'Error! [' + error . message + ']' ) ;
115
+ throw error ;
116
+ }
112
117
if ( ! resolved ) {
113
118
Scheduler . log ( 'Suspend! [' + text + ']' ) ;
114
119
throw promise ;
@@ -120,6 +125,10 @@ describe('ReactDOMFizzSuspenseList', () => {
120
125
resolved = true ;
121
126
return resolve ( ) ;
122
127
} ;
128
+ Component . reject = function ( e ) {
129
+ error = e ;
130
+ return resolve ( ) ;
131
+ } ;
123
132
} ) ;
124
133
return Component ;
125
134
}
@@ -774,4 +783,65 @@ describe('ReactDOMFizzSuspenseList', () => {
774
783
'The render was aborted by the server without a reason.' ,
775
784
] ) ;
776
785
} ) ;
786
+
787
+ // @gate enableSuspenseList
788
+ it ( 'can error a pending SuspenseList' , async ( ) => {
789
+ const A = createAsyncText ( 'A' ) ;
790
+
791
+ function Foo ( ) {
792
+ return (
793
+ < div >
794
+ < SuspenseList revealOrder = "forwards" >
795
+ < Suspense fallback = { < Text text = "Loading A" /> } >
796
+ < A />
797
+ </ Suspense >
798
+ < Suspense fallback = { < Text text = "Loading B" /> } >
799
+ < Text text = "B" />
800
+ </ Suspense >
801
+ </ SuspenseList >
802
+ </ div >
803
+ ) ;
804
+ }
805
+
806
+ const errors = [ ] ;
807
+ await serverAct ( async ( ) => {
808
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> , {
809
+ onError ( error ) {
810
+ errors . push ( error . message ) ;
811
+ } ,
812
+ } ) ;
813
+ pipe ( writable ) ;
814
+ } ) ;
815
+
816
+ assertLog ( [
817
+ 'Suspend! [A]' ,
818
+ 'B' , // TODO: Defer rendering the content after fallback if previous suspended,
819
+ 'Loading A' ,
820
+ 'Loading B' ,
821
+ ] ) ;
822
+
823
+ expect ( getVisibleChildren ( container ) ) . toEqual (
824
+ < div >
825
+ < span > Loading A</ span >
826
+ < span > Loading B</ span >
827
+ </ div > ,
828
+ ) ;
829
+
830
+ await serverAct ( async ( ) => {
831
+ A . reject ( new Error ( 'hi' ) ) ;
832
+ } ) ;
833
+
834
+ assertLog ( [ 'Error! [hi]' ] ) ;
835
+
836
+ expect ( getVisibleChildren ( container ) ) . toEqual (
837
+ < div >
838
+ < span > Loading A</ span >
839
+ < span > B</ span >
840
+ </ div > ,
841
+ ) ;
842
+
843
+ expect ( errors ) . toEqual ( [ 'hi' ] ) ;
844
+ expect ( hasErrored ) . toBe ( false ) ;
845
+ expect ( hasCompleted ) . toBe ( true ) ;
846
+ } ) ;
777
847
} ) ;
0 commit comments