@@ -77,102 +77,54 @@ export default class AwaitBlock extends Node {
77
77
78
78
const { snippet } = this . expression ;
79
79
80
+ const info = block . getUniqueName ( `info` ) ;
80
81
const promise = block . getUniqueName ( `promise` ) ;
81
- const resolved = block . getUniqueName ( `resolved` ) ;
82
- const await_block = block . getUniqueName ( `await_block` ) ;
83
- const await_block_type = block . getUniqueName ( `await_block_type` ) ;
84
- const token = block . getUniqueName ( `token` ) ;
85
- const await_token = block . getUniqueName ( `await_token` ) ;
86
- const handle_promise = block . getUniqueName ( `handle_promise` ) ;
87
- const replace_await_block = block . getUniqueName ( `replace_await_block` ) ;
88
- const old_block = block . getUniqueName ( `old_block` ) ;
89
- const value = block . getUniqueName ( `value` ) ;
90
- const error = block . getUniqueName ( `error` ) ;
91
- const create_pending_block = this . pending . block . name ;
92
- const create_then_block = this . then . block . name ;
93
- const create_catch_block = this . catch . block . name ;
94
-
95
- block . addVariable ( await_block ) ;
96
- block . addVariable ( await_block_type ) ;
97
- block . addVariable ( await_token ) ;
82
+
98
83
block . addVariable ( promise ) ;
99
- block . addVariable ( resolved ) ;
100
84
101
85
block . maintainContext = true ;
102
86
87
+ const infoProps = [
88
+ block . alias ( 'component' ) === 'component' ? 'component' : `component: #component` ,
89
+ 'ctx' ,
90
+ 'current: null' ,
91
+ this . pending . block . name && `pending: ${ this . pending . block . name } ` ,
92
+ this . then . block . name && `then: ${ this . then . block . name } ` ,
93
+ this . catch . block . name && `catch: ${ this . catch . block . name } ` ,
94
+ this . then . block . name && `value: '${ this . value } '` ,
95
+ this . catch . block . name && `error: '${ this . error } '`
96
+ ] . filter ( Boolean ) ;
97
+
98
+ block . builders . init . addBlock ( deindent `
99
+ let ${ info } = {
100
+ ${ infoProps . join ( ',\n' ) }
101
+ };
102
+ ` ) ;
103
+
103
104
// the `#component.root.set({})` below is just a cheap way to flush
104
105
// any oncreate handlers. We could have a dedicated `flush()` method
105
106
// but it's probably not worth it
106
107
107
108
block . builders . init . addBlock ( deindent `
108
- function ${ replace_await_block } (${ token } , type, ctx) {
109
- if (${ token } !== ${ await_token } ) return;
110
-
111
- var ${ old_block } = ${ await_block } ;
112
- ${ await_block } = type && (${ await_block_type } = type)(#component, ctx);
113
-
114
- if (${ old_block } ) {
115
- ${ old_block } .u();
116
- ${ old_block } .d();
117
- ${ await_block } .c();
118
- ${ await_block } .m(${ updateMountNode } , ${ anchor } );
119
-
120
- #component.root.set({});
121
- }
122
- }
123
-
124
- function ${ handle_promise } (${ promise } ) {
125
- var ${ token } = ${ await_token } = {};
126
-
127
- if (@isPromise(${ promise } )) {
128
- ${ promise } .then(function(${ value } ) {
129
- ${ this . value ? deindent `
130
- ${ resolved } = { ${ this . value } : ${ value } };
131
- ${ replace_await_block } (${ token } , ${ create_then_block } , @assign(@assign({}, ctx), ${ resolved } ));
132
- ` : deindent `
133
- ${ replace_await_block } (${ token } , null, null);
134
- ` }
135
- }, function (${ error } ) {
136
- ${ this . error ? deindent `
137
- ${ resolved } = { ${ this . error } : ${ error } };
138
- ${ replace_await_block } (${ token } , ${ create_catch_block } , @assign(@assign({}, ctx), ${ resolved } ));
139
- ` : deindent `
140
- ${ replace_await_block } (${ token } , null, null);
141
- ` }
142
- });
143
-
144
- // if we previously had a then/catch block, destroy it
145
- if (${ await_block_type } !== ${ create_pending_block } ) {
146
- ${ replace_await_block } (${ token } , ${ create_pending_block } , ctx);
147
- return true;
148
- }
149
- } else {
150
- ${ resolved } = { ${ this . value } : ${ promise } };
151
- if (${ await_block_type } !== ${ create_then_block } ) {
152
- ${ replace_await_block } (${ token } , ${ create_then_block } , @assign(@assign({}, ctx), ${ resolved } ));
153
- return true;
154
- }
155
- }
156
- }
157
-
158
- ${ handle_promise } (${ promise } = ${ snippet } );
109
+ @handlePromise(${ promise } = ${ snippet } , ${ info } );
159
110
` ) ;
160
111
161
112
block . builders . create . addBlock ( deindent `
162
- ${ await_block } .c();
113
+ ${ info } .block .c();
163
114
` ) ;
164
115
165
116
if ( parentNodes ) {
166
117
block . builders . claim . addBlock ( deindent `
167
- ${ await_block } .l(${ parentNodes } );
118
+ ${ info } .block .l(${ parentNodes } );
168
119
` ) ;
169
120
}
170
121
171
122
const initialMountNode = parentNode || '#target' ;
172
123
const anchorNode = parentNode ? 'null' : 'anchor' ;
173
124
174
125
block . builders . mount . addBlock ( deindent `
175
- ${ await_block } .m(${ initialMountNode } , ${ anchorNode } );
126
+ ${ info } .block.m(${ initialMountNode } , ${ info } .anchor = ${ anchorNode } );
127
+ ${ info } .mount = () => ${ updateMountNode } ;
176
128
` ) ;
177
129
178
130
const conditions = [ ] ;
@@ -184,38 +136,39 @@ export default class AwaitBlock extends Node {
184
136
185
137
conditions . push (
186
138
`${ promise } !== (${ promise } = ${ snippet } )` ,
187
- `${ handle_promise } (${ promise } , ctx)`
139
+ `@handlePromise(${ promise } , ${ info } )`
140
+ ) ;
141
+
142
+ block . builders . update . addLine (
143
+ `${ info } .ctx = ctx;`
188
144
) ;
189
145
190
146
if ( this . pending . block . hasUpdateMethod ) {
191
147
block . builders . update . addBlock ( deindent `
192
148
if (${ conditions . join ( ' && ' ) } ) {
193
149
// nothing
194
150
} else {
195
- ${ await_block } . p(changed, @assign(@assign({}, ctx), ${ resolved } ));
151
+ ${ info } .block. p(changed, @assign(@assign({}, ctx), ${ info } .resolved ));
196
152
}
197
153
` ) ;
198
154
} else {
199
155
block . builders . update . addBlock ( deindent `
200
- if (${ conditions . join ( ' && ' ) } ) {
201
- ${ await_block } .c();
202
- ${ await_block } .m(${ anchor } .parentNode, ${ anchor } );
203
- }
156
+ ${ conditions . join ( ' && ' ) }
204
157
` ) ;
205
158
}
206
159
207
160
block . builders . unmount . addBlock ( deindent `
208
- ${ await_block } .u();
161
+ ${ info } .block .u();
209
162
` ) ;
210
163
211
164
block . builders . destroy . addBlock ( deindent `
212
- ${ await_token } = null ;
213
- ${ await_block } .d() ;
165
+ ${ info } .block.d() ;
166
+ ${ info } = null ;
214
167
` ) ;
215
168
216
169
[ this . pending , this . then , this . catch ] . forEach ( status => {
217
170
status . children . forEach ( child => {
218
- child . build ( status . block , null , 'nodes' ) ;
171
+ child . build ( status . block , null , 'nodes' ) ;
219
172
} ) ;
220
173
} ) ;
221
174
}
0 commit comments