@@ -202,29 +202,42 @@ export class WidgetManager extends JupyterLabManager {
202
202
{ version : '1.0.0' }
203
203
) ;
204
204
205
- // Send a models request msg
206
- initComm . send ( { method : 'request_states' } , { } ) ;
207
-
208
- let [ data , buffers ] : any = await new Promise ( resolve => {
209
- initComm . on_msg ( msg => {
210
- const data = msg [ 'content' ] [ 'data' ] ;
205
+ // Fetch widget states
206
+ let data : any ;
207
+ let buffers : any ;
208
+ try {
209
+ await new Promise ( ( resolve , reject ) => {
210
+ initComm . on_msg ( msg => {
211
+ data = msg [ 'content' ] [ 'data' ] ;
212
+
213
+ if ( data . method != 'update_states' ) {
214
+ console . warn ( `Unknown ${ data . method } message on the Control channel` ) ;
215
+ return ;
216
+ }
211
217
212
- if ( data . method != 'update_states' ) {
213
- console . warn ( `Unknown ${ data . method } message on the Control channel` ) ;
214
- return ;
215
- }
218
+ buffers = ( msg . buffers || [ ] ) . map ( ( b : any ) => {
219
+ if ( b instanceof DataView ) {
220
+ return b ;
221
+ } else {
222
+ return new DataView ( b instanceof ArrayBuffer ? b : b . buffer ) ;
223
+ }
224
+ } ) ;
216
225
217
- const buffers = ( msg . buffers || [ ] ) . map ( ( b : any ) => {
218
- if ( b instanceof DataView ) {
219
- return b ;
220
- } else {
221
- return new DataView ( b instanceof ArrayBuffer ? b : b . buffer ) ;
222
- }
226
+ resolve ( null ) ;
223
227
} ) ;
224
228
225
- resolve ( [ data , buffers ] ) ;
229
+ initComm . on_close ( reject ) ;
230
+
231
+ // Send a states request msg
232
+ initComm . send ( { method : 'request_states' } , { } ) ;
226
233
} ) ;
227
- } ) ;
234
+ }
235
+ catch {
236
+ console . warn ( 'Failed to open "jupyter.widget.control" comm channel, fallback to slow fetching of widgets.' ) ;
237
+ // TODO Fallback to the old implementation for old ipywidgets versions
238
+ // return this._build_models_slow();
239
+ return { } ;
240
+ }
228
241
229
242
initComm . close ( ) ;
230
243
@@ -242,6 +255,7 @@ export class WidgetManager extends JupyterLabManager {
242
255
243
256
const widgetPromises : Promise < base . WidgetModel > [ ] = [ ] ;
244
257
258
+ // Start creating all widgets
245
259
for ( const widget_id in states ) {
246
260
const state = states [ widget_id ] ;
247
261
@@ -273,6 +287,7 @@ export class WidgetManager extends JupyterLabManager {
273
287
}
274
288
}
275
289
290
+ // Wait for widgets to be created
276
291
const widgets = await Promise . all ( widgetPromises ) ;
277
292
for ( const model of widgets ) {
278
293
models [ model . model_id ] = model ;
0 commit comments