diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js
index 242c67975..b7d2aeaa9 100644
--- a/IPython/html/static/widgets/js/manager.js
+++ b/IPython/html/static/widgets/js/manager.js
@@ -84,13 +84,16 @@ define([
var view_name = model.get('_view_name');
var view_mod = model.get('_view_module');
- var error = options.error || function(error) { console.log(error); };
+ var options = options || {};
+
+ return new Promise(function(resolve, reject) {
+ var instantiate_view = function(ViewType) {
+ if (ViewType === undefined) {
+ reject(Error("Unknown view, module: "+view_mod+", view: "+view_name));
+ }
- var instantiate_view = function(ViewType) {
- if (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;
}
@@ -99,22 +102,18 @@ define([
var parameters = {model: model, options: options};
var view = new ViewType(parameters);
view.render();
- model.on('destroy', view.remove, view);
- if (options.success) {
- options.success(view);
- }
+ view.listenTo(model, 'destroy', view.remove);
+ resolve(view);
+ };
+
+
+ if (view_mod) {
+ require([view_mod], function(module) {
+ instantiate_view(module[view_name]);
+ }, reject);
} else {
- error({unknown_view: true, view_name: view_name,
- view_module: view_mod});
+ instantiate_view(WidgetManager._view_types[view_name]);
}
- };
-
- if (view_mod) {
- require([view_mod], function(module) {
- instantiate_view(module[view_name]);
- }, error);
- } else {
- instantiate_view(WidgetManager._view_types[view_name]);
}
};
@@ -196,7 +195,7 @@ define([
};
WidgetManager.prototype.create_model = function (options) {
- // Create and return a new widget model.
+ // Create and return a promise to create a new widget model.
//
// Minimally, one must provide the model_name and widget_class
// parameters to create a model from Javascript.
@@ -220,56 +219,46 @@ define([
// widget_class: (optional) string
// Target name of the widget in the back-end.
// comm: (optional) Comm
- // success: (optional) callback
- // Callback for when the model was created successfully.
- // error: (optional) callback
- // Callback for when the model wasn't created.
// init_state_callback: (optional) callback
// Called when the first state push from the back-end is
// recieved. Allows you to modify the model after it's
// complete state is filled and synced.
- // Make default callbacks if not specified.
- var error = options.error || function(error) { console.log(error); };
-
// Create a comm if it wasn't provided.
var comm = options.comm;
if (!comm) {
comm = this.comm_manager.new_comm('ipython.widget', {'widget_class': options.widget_class});
}
- // Create a new model that is connected to the comm.
- var that = this;
- var instantiate_model = function(ModelType) {
- var model_id = comm.comm_id;
- var widget_model = new ModelType(that, model_id, comm, options.init_state_callback);
- widget_model.on('comm:close', function () {
- delete that._models[model_id];
- });
- that._models[model_id] = widget_model;
- if (options.success) {
- options.success(widget_model);
- }
- };
-
- // Get the model type using require or through the registry.
- var widget_type_name = options.model_name;
- var widget_module = options.model_module;
- if (widget_module) {
-
- // Load the module containing the widget model
- require([widget_module], function(mod) {
- if (mod[widget_type_name]) {
- instantiate_model(mod[widget_type_name]);
- } else {
- error("Error creating widget model: " + widget_type_name
- + " not found in " + widget_module);
+ return new Promise(function(resolve, reject) {
+ // Create a new model that is connected to the comm.
+ var that = this;
+ var instantiate_model = function(ModelType) {
+ if (ModelType === undefined) {
+ reject(Error("Error creating widget model: " + widget_type_name
+ + " not found in " + widget_module));
}
- }, error);
- } else {
-
- // No module specified, load from the global models registry
- instantiate_model(WidgetManager._model_types[widget_type_name]);
+ var model_id = comm.comm_id;
+ var widget_model = new ModelType(that, model_id, comm, options.init_state_callback);
+ widget_model.once('comm:close', function () {
+ delete that._models[model_id];
+ });
+ that._models[model_id] = widget_model;
+ resolve(widget_model);
+ };
+
+ // Get the model type using require or through the registry.
+ var widget_type_name = options.model_name;
+ var widget_module = options.model_module;
+ if (widget_module) {
+ // Load the module containing the widget model
+ require([widget_module], function(mod) {
+ instantiate_model(mod[widget_type_name]);
+ }, reject);
+ } else {
+ // No module specified, load from the global models registry
+ instantiate_model(WidgetManager._model_types[widget_type_name]);
+ }
}
};