diff --git a/src/ListenerMixin.js b/src/ListenerMixin.js index 69bea97..bab8e3c 100644 --- a/src/ListenerMixin.js +++ b/src/ListenerMixin.js @@ -16,10 +16,22 @@ module.exports = { * @param {Action|Store} listenable An Action or Store that should be * listened to. * @param {Function} callback The callback to register as event handler + * @param {Function} initialCallback The callback to register as initial handler */ - listenTo: function(listenable, callback) { + listenTo: function(listenable, callback, initialCallback) { var unsubscribe = listenable.listen(callback, this); this.subscriptions.push(unsubscribe); + + if (initialCallback && _.isFunction(initialCallback)) { + if (listenable.getInitialData && _.isFunction(listenable.getInitialData)) { + data = listenable.getInitialData(); + if (data && data.then && _.isFunction(data.then)) { + data.then(initialCallback); + } else { + initialCallback(data); + } + } + } }, componentWillUnmount: function() { diff --git a/src/createStore.js b/src/createStore.js index 3b70865..b11e605 100644 --- a/src/createStore.js +++ b/src/createStore.js @@ -16,7 +16,7 @@ module.exports = function(definition) { } } _.extend(Store.prototype, definition); - Store.prototype.listenTo = function(listenable, callback) { + Store.prototype.listenTo = function(listenable, callback, initialCallback) { if (listenable === this) { throw Error("Store is not able to listen to itself"); } @@ -26,6 +26,16 @@ module.exports = function(definition) { if (this.hasListener(listenable)) { throw Error("Store cannot listen to this listenable because of circular loop"); } + if (initialCallback && _.isFunction(initialCallback)) { + if (listenable.getInitialData && _.isFunction(listenable.getInitialData)) { + data = listenable.getInitialData(); + if (data && data.then && _.isFunction(data.then)) { + data.then(initialCallback); + } else { + initialCallback(data); + } + } + } this.registered.push(listenable); return listenable.listen(callback, this); };