From 94ab07f651af77671946dabda2e7c972617357d4 2014-11-15 16:48:33 From: Jason Grout Date: 2014-11-15 16:48:33 Subject: [PATCH] Simplify code by using Promises in a better way; try_load -> load --- diff --git a/IPython/html/static/base/js/utils.js b/IPython/html/static/base/js/utils.js index 9d103ab..aeec8a3 100644 --- a/IPython/html/static/base/js/utils.js +++ b/IPython/html/static/base/js/utils.js @@ -606,7 +606,7 @@ define([ }); }; - var try_load = function(class_name, module_name, registry) { + var load = function(class_name, module_name, registry) { // Tries to load a class // // Tries to load a class from a module using require.js, if a module @@ -618,7 +618,7 @@ define([ if (module_name) { require([module_name], function(module) { if (module[class_name] === undefined) { - reject(Error('Class not found in module.')); + reject(new Error('Class not found in module.')); } else { resolve(module[class_name]); } @@ -627,12 +627,12 @@ define([ if (registry && registry[class_name]) { resolve(registry[class_name]); } else { - reject(Error('Class not found in registry.')); + reject(new Error('Class not found in registry.')); } } }); }; - + var utils = { regex_split : regex_split, uuid : uuid, @@ -662,7 +662,7 @@ define([ XHR_ERROR : XHR_ERROR, wrap_ajax_error : wrap_ajax_error, promising_ajax : promising_ajax, - try_load: try_load, + load: load, }; // Backwards compatability. diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index 64eed36..10ffe0b 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -87,27 +87,22 @@ define([ WidgetManager.prototype.create_view = function(model, options) { - // Creates a view for a particular model. - return new Promise(function(resolve, reject) { - var view_name = model.get('_view_name'); - var view_module = model.get('_view_module'); - utils.try_load(view_name, view_module, WidgetManager._view_types).then(function(ViewType){ - - // If a view is passed into the method, use that view's cell as - // the cell for the view that is created. - options = options || {}; - if (options.parent !== undefined) { - options.cell = options.parent.options.cell; - } - - // Create and render the view... - var parameters = {model: model, options: options}; - var view = new ViewType(parameters); - view.render(); - model.on('destroy', view.remove, view); - resolve(view); - }, reject); - }); + // Creates a promise for a view of a given model + return utils.load(model.get('_view_name'), model.get('_view_module'), + WidgetManager._view_types).then(function(ViewType) { + // If a view is passed into the method, use that view's cell as + // the cell for the view that is created. + options = options || {}; + if (options.parent !== undefined) { + options.cell = options.parent.options.cell; + } + // Create and render the view... + var parameters = {model: model, options: options}; + var view = new ViewType(parameters); + view.listenTo(model, 'destroy', view.remove); + view.render(); + return view; + }); }; WidgetManager.prototype.get_msg_cell = function (msg_id) { @@ -171,20 +166,7 @@ define([ }; WidgetManager.prototype.get_model = function (model_id) { - // Look-up a model instance by its id. - var that = this; - var model = that._models[model_id]; - if (model !== undefined) { - return new Promise(function(resolve, reject){ - if (model instanceof Promise) { - model.then(resolve, reject); - } else { - resolve(model); - } - }); - } else { - return undefined; - } + return that._models[model_id]; }; WidgetManager.prototype._handle_comm_open = function (comm, msg) { @@ -196,7 +178,7 @@ define([ }; WidgetManager.prototype.create_model = function (options) { - // Create and return a promise to create a new widget model. + // Create and return a promise for a new widget model // // Minimally, one must provide the model_name and widget_class // parameters to create a model from Javascript. @@ -230,23 +212,16 @@ define([ var that = this; var model_id = comm.comm_id; - var promise = new Promise(function(resolve, reject) { - - // Get the model type using require or through the registry. - var widget_type_name = options.model_name; - var widget_module = options.model_module; - utils.try_load(widget_type_name, widget_module, WidgetManager._model_types) - .then(function(ModelType) { - var widget_model = new ModelType(that, model_id, comm); - widget_model.on('comm:close', function () { - delete that._models[model_id]; - }); - that._models[model_id] = widget_model; - resolve(widget_model); - }, reject); - }); - this._models[model_id] = promise; - return promise; + var model_promise = utils.load(options.model_name, options.model_module, WidgetManager._model_types) + .then(function(ModelType) { + var widget_model = new ModelType(that, model_id, comm); + widget_model.once('comm:close', function () { + delete that._models[model_id]; + }); + return widget_model; + }); + this._models[model_id] = model_promise; + return model_promise; }; // Backwards compatibility.