File tree 1 file changed +16
-0
lines changed
1 file changed +16
-0
lines changed Original file line number Diff line number Diff line change @@ -5,13 +5,24 @@ import { getCreateRoot } from './react-dom-client';
5
5
type Renderable = Parameters < ReactDOM . Renderer > [ 0 ] [ number ] ;
6
6
type ReactHTMLElementDOMRoot = Pick < Root , 'render' | 'unmount' > ;
7
7
8
+ const awaitValue = < T > ( awaiter : ( ) => T ) : Promise < T > => new Promise ( ( resolve ) => {
9
+ const result = awaiter ( ) ;
10
+ if ( result ) {
11
+ resolve ( result ) ;
12
+ } else {
13
+ setTimeout ( ( ) => resolve ( awaitValue ( awaiter ) ) , 100 ) ;
14
+ }
15
+ } ) ;
16
+
8
17
class ReactHTMLElement extends HTMLElement {
9
18
private _initialized ?: boolean ;
10
19
11
20
private _mountPoint ?: Element ;
12
21
13
22
private _root ?: ReactHTMLElementDOMRoot ;
14
23
24
+ private _awaitingRoot = false ;
25
+
15
26
private getShadowRoot ( ) : ShadowRoot {
16
27
return this . shadowRoot || this . attachShadow ( { mode : 'open' } ) ;
17
28
}
@@ -43,9 +54,14 @@ class ReactHTMLElement extends HTMLElement {
43
54
}
44
55
45
56
async root ( ) : Promise < ReactHTMLElementDOMRoot > {
57
+ if ( this . _awaitingRoot ) {
58
+ await awaitValue ( ( ) => this . _root ) ;
59
+ }
46
60
if ( this . _root ) return this . _root ;
47
61
62
+ this . _awaitingRoot = true ;
48
63
this . _root = ( await getCreateRoot ( ) ) ( this . mountPoint ) ;
64
+ this . _awaitingRoot = false ;
49
65
return this . _root ;
50
66
}
51
67
You can’t perform that action at this time.
0 commit comments