@@ -27,28 +27,6 @@ var merge = require('react/lib/merge');
2727var _callbacks = [ ] ;
2828var _promises = [ ] ;
2929
30- /**
31- * Add a promise to the queue of callback invocation promises.
32- * @param {function } callback The Store's registered callback.
33- * @param {object } payload The data from the Action.
34- */
35- var _addPromise = function ( callback , payload ) {
36- _promises . push ( new Promise ( function ( resolve , reject ) {
37- if ( callback ( payload ) ) {
38- resolve ( payload ) ;
39- } else {
40- reject ( new Error ( 'Dispatcher callback unsuccessful' ) ) ;
41- }
42- } ) ) ;
43- } ;
44-
45- /**
46- * Empty the queue of callback invocation promises.
47- */
48- var _clearPromises = function ( ) {
49- _promises = [ ] ;
50- } ;
51-
5230var Dispatcher = function ( ) { } ;
5331Dispatcher . prototype = merge ( Dispatcher . prototype , {
5432
@@ -67,10 +45,26 @@ Dispatcher.prototype = merge(Dispatcher.prototype, {
6745 * @param {object } payload The data from the action.
6846 */
6947 dispatch : function ( payload ) {
70- _callbacks . forEach ( function ( callback ) {
71- _addPromise ( callback , payload ) ;
48+ // First create array of promises for callbacks to reference.
49+ var _resolves = [ ] ;
50+ var _rejects = [ ] ;
51+ _promises = _callbacks . map ( function ( _ , i ) {
52+ return new Promise ( function ( resolve , reject ) {
53+ _resolves [ i ] = resolve ;
54+ _rejects [ i ] = reject ;
55+ } ) ;
56+ } ) ;
57+ // Dispatch to callbacks and resolve/reject promises.
58+ _callbacks . forEach ( function ( callback , i ) {
59+ // Callback can return an obj, to resolve, or a promise, to chain.
60+ // See waitFor() for why this might be useful.
61+ Promise . resolve ( callback ( payload ) ) . then ( function ( ) {
62+ _resolves [ i ] ( payload ) ;
63+ } , function ( ) {
64+ _rejects [ i ] ( new Error ( 'Dispatcher callback unsuccessful' ) ) ;
65+ } ) ;
7266 } ) ;
73- Promise . all ( _promises ) . then ( _clearPromises ) ;
67+ _promises = [ ] ;
7468 } ,
7569
7670 /**
@@ -108,10 +102,10 @@ Dispatcher.prototype = merge(Dispatcher.prototype, {
108102 * A more robust Dispatcher would issue a warning in this scenario.
109103 */
110104 waitFor : function ( /*array*/ promiseIndexes , /*function*/ callback ) {
111- var selectedPromises = _promises . filter ( function ( /*object*/ _ , /*number*/ j ) {
112- return promiseIndexes . indexOf ( j ) !== - 1 ;
105+ var selectedPromises = promiseIndexes . map ( function ( index ) {
106+ return _promises [ index ] ;
113107 } ) ;
114- Promise . all ( selectedPromises ) . then ( callback ) ;
108+ return Promise . all ( selectedPromises ) . then ( callback ) ;
115109 }
116110
117111} ) ;
0 commit comments