@@ -199,7 +199,7 @@ function qFactory(nextTick, exceptionHandler) {
199199 var callback ;
200200 for ( var i = 0 , ii = callbacks . length ; i < ii ; i ++ ) {
201201 callback = callbacks [ i ] ;
202- value . then ( callback [ 0 ] , callback [ 1 ] ) ;
202+ value . then ( callback [ 0 ] , callback [ 1 ] , callback [ 2 ] ) ;
203203 }
204204 } ) ;
205205 }
@@ -212,8 +212,25 @@ function qFactory(nextTick, exceptionHandler) {
212212 } ,
213213
214214
215+ notify : function ( progress ) {
216+ if ( pending ) {
217+ var callbacks = pending ;
218+
219+ if ( pending . length ) {
220+ nextTick ( function ( ) {
221+ var callback ;
222+ for ( var i = 0 , ii = callbacks . length ; i < ii ; i ++ ) {
223+ callback = callbacks [ i ] ;
224+ callback [ 2 ] ( progress ) ;
225+ }
226+ } ) ;
227+ }
228+ }
229+ } ,
230+
231+
215232 promise : {
216- then : function ( callback , errback ) {
233+ then : function ( callback , errback , progressback ) {
217234 var result = defer ( ) ;
218235
219236 var wrappedCallback = function ( value ) {
@@ -234,10 +251,18 @@ function qFactory(nextTick, exceptionHandler) {
234251 }
235252 } ;
236253
254+ var wrappedProgressback = function ( progress ) {
255+ try {
256+ result . notify ( ( progressback || defaultCallback ) ( progress ) ) ;
257+ } catch ( e ) {
258+ exceptionHandler ( e ) ;
259+ }
260+ } ;
261+
237262 if ( pending ) {
238- pending . push ( [ wrappedCallback , wrappedErrback ] ) ;
263+ pending . push ( [ wrappedCallback , wrappedErrback , wrappedProgressback ] ) ;
239264 } else {
240- value . then ( wrappedCallback , wrappedErrback ) ;
265+ value . then ( wrappedCallback , wrappedErrback , wrappedProgressback ) ;
241266 }
242267
243268 return result . promise ;
@@ -359,7 +384,7 @@ function qFactory(nextTick, exceptionHandler) {
359384 * @param {* } value Value or a promise
360385 * @returns {Promise } Returns a promise of the passed value or promise
361386 */
362- var when = function ( value , callback , errback ) {
387+ var when = function ( value , callback , errback , progressback ) {
363388 var result = defer ( ) ,
364389 done ;
365390
@@ -381,15 +406,26 @@ function qFactory(nextTick, exceptionHandler) {
381406 }
382407 } ;
383408
409+ var wrappedProgressback = function ( progress ) {
410+ try {
411+ return ( progressback || defaultCallback ) ( progress ) ;
412+ } catch ( e ) {
413+ exceptionHandler ( e ) ;
414+ }
415+ } ;
416+
384417 nextTick ( function ( ) {
385418 ref ( value ) . then ( function ( value ) {
386419 if ( done ) return ;
387420 done = true ;
388- result . resolve ( ref ( value ) . then ( wrappedCallback , wrappedErrback ) ) ;
421+ result . resolve ( ref ( value ) . then ( wrappedCallback , wrappedErrback , wrappedProgressback ) ) ;
389422 } , function ( reason ) {
390423 if ( done ) return ;
391424 done = true ;
392425 result . resolve ( wrappedErrback ( reason ) ) ;
426+ } , function ( progress ) {
427+ if ( done ) return ;
428+ result . notify ( wrappedProgressback ( progress ) ) ;
393429 } ) ;
394430 } ) ;
395431
0 commit comments