diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js
index 6540631..1236f71 100644
--- a/IPython/html/static/widgets/js/manager.js
+++ b/IPython/html/static/widgets/js/manager.js
@@ -31,12 +31,14 @@ define([
// Load the initial state of the widget manager if a load callback was
// registered.
+ var that = this;
if (WidgetManager._load_callback) {
- this.set_state(WidgetManager._load_callback.call(this));
+ Promise.resolve(WidgetManager._load_callback.call(this)).then(function(state) {
+ that.set_state(state);
+ }).catch(utils.reject('Error loading widget manager state', true));
}
// Setup state saving code.
- var that = this;
this.notebook.events.on('before_save.Notebook', function() {
var save_callback = WidgetManager._save_callback;
var options = WidgetManager._get_state_options;
@@ -69,6 +71,17 @@ define([
WidgetManager.set_state_callbacks = function (load_callback, save_callback, options) {
// Registers callbacks for widget state persistence.
+ //
+ // Parameters
+ // ----------
+ // load_callback: function()
+ // function that is called when the widget manager state should be
+ // loaded. This function should return a promise for the widget
+ // manager state. An empty state is an empty dictionary `{}`.
+ // save_callback: function(state as dictionary)
+ // function that is called when the notebook is saved or autosaved.
+ // The current state of the widget manager is passed in as the first
+ // argument.
WidgetManager._load_callback = load_callback;
WidgetManager._save_callback = save_callback;
WidgetManager._get_state_options = options;
@@ -76,7 +89,9 @@ define([
// Use the load callback to immediately load widget states.
WidgetManager._managers.forEach(function(manager) {
if (load_callback) {
- manager.set_state(load_callback.call(manager));
+ Promise.resolve(load_callback.call(manager)).then(function(state) {
+ manager.set_state(state);
+ }).catch(utils.reject('Error loading widget manager state', true));
}
});
};