@@ -299,14 +299,18 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
299
299
* @returns {Deferred } Returns a new instance of deferred.
300
300
*/
301
301
var defer = function ( ) {
302
- var d = new Deferred ( ) ;
303
- //Necessary to support unbound execution :/
304
- d . resolve = simpleBind ( d , d . resolve ) ;
305
- d . reject = simpleBind ( d , d . reject ) ;
306
- d . notify = simpleBind ( d , d . notify ) ;
307
- return d ;
302
+ return new Deferred ( ) ;
308
303
} ;
309
304
305
+ function Deferred ( ) {
306
+ var promise = this . promise = new Promise ( ) ;
307
+ //Non prototype methods necessary to support unbound execution :/
308
+ this . resolve = function ( val ) { resolvePromise ( promise , val ) ; } ;
309
+ this . reject = function ( reason ) { rejectPromise ( promise , reason ) ; } ;
310
+ this . notify = function ( progress ) { notifyPromise ( promise , progress ) ; } ;
311
+ }
312
+
313
+
310
314
function Promise ( ) {
311
315
this . $$state = { status : 0 } ;
312
316
}
@@ -316,13 +320,13 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
316
320
if ( isUndefined ( onFulfilled ) && isUndefined ( onRejected ) && isUndefined ( progressBack ) ) {
317
321
return this ;
318
322
}
319
- var result = new Deferred ( ) ;
323
+ var result = new Promise ( ) ;
320
324
321
325
this . $$state . pending = this . $$state . pending || [ ] ;
322
326
this . $$state . pending . push ( [ result , onFulfilled , onRejected , progressBack ] ) ;
323
327
if ( this . $$state . status > 0 ) scheduleProcessQueue ( this . $$state ) ;
324
328
325
- return result . promise ;
329
+ return result ;
326
330
} ,
327
331
328
332
'catch' : function ( callback ) {
@@ -338,34 +342,27 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
338
342
}
339
343
} ) ;
340
344
341
- //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native
342
- function simpleBind ( context , fn ) {
343
- return function ( value ) {
344
- fn . call ( context , value ) ;
345
- } ;
346
- }
347
-
348
345
function processQueue ( state ) {
349
- var fn , deferred , pending ;
346
+ var fn , promise , pending ;
350
347
351
348
pending = state . pending ;
352
349
state . processScheduled = false ;
353
350
state . pending = undefined ;
354
351
try {
355
352
for ( var i = 0 , ii = pending . length ; i < ii ; ++ i ) {
356
353
state . pur = true ;
357
- deferred = pending [ i ] [ 0 ] ;
354
+ promise = pending [ i ] [ 0 ] ;
358
355
fn = pending [ i ] [ state . status ] ;
359
356
try {
360
357
if ( isFunction ( fn ) ) {
361
- deferred . resolve ( fn ( state . value ) ) ;
358
+ resolvePromise ( promise , fn ( state . value ) ) ;
362
359
} else if ( state . status === 1 ) {
363
- deferred . resolve ( state . value ) ;
360
+ resolvePromise ( promise , state . value ) ;
364
361
} else {
365
- deferred . reject ( state . value ) ;
362
+ rejectPromise ( promise , state . value ) ;
366
363
}
367
364
} catch ( e ) {
368
- deferred . reject ( e ) ;
365
+ rejectPromise ( promise , e ) ;
369
366
exceptionHandler ( e ) ;
370
367
}
371
368
}
@@ -410,85 +407,81 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
410
407
nextTick ( processQueueFn ( state ) ) ;
411
408
}
412
409
413
- function Deferred ( ) {
414
- this . promise = new Promise ( ) ;
410
+ function resolvePromise ( promise , val ) {
411
+ if ( promise . $$state . status ) return ;
412
+ if ( val === promise ) {
413
+ $$reject ( promise , $qMinErr (
414
+ 'qcycle' ,
415
+ 'Expected promise to be resolved with value other than itself \'{0}\'' ,
416
+ val ) ) ;
417
+ } else {
418
+ $$resolve ( promise , val ) ;
419
+ }
420
+
415
421
}
416
422
417
- extend ( Deferred . prototype , {
418
- resolve : function ( val ) {
419
- if ( this . promise . $$state . status ) return ;
420
- if ( val === this . promise ) {
421
- this . $$reject ( $qMinErr (
422
- 'qcycle' ,
423
- 'Expected promise to be resolved with value other than itself \'{0}\'' ,
424
- val ) ) ;
423
+ function $$resolve ( promise , val ) {
424
+ var then ;
425
+ var done = false ;
426
+ try {
427
+ if ( ( isObject ( val ) || isFunction ( val ) ) ) then = val && val . then ;
428
+ if ( isFunction ( then ) ) {
429
+ promise . $$state . status = - 1 ;
430
+ then . call ( val , doResolve , doReject , doNotify ) ;
425
431
} else {
426
- this . $$resolve ( val ) ;
427
- }
428
-
429
- } ,
430
-
431
- $$resolve : function ( val ) {
432
- var then ;
433
- var that = this ;
434
- var done = false ;
435
- try {
436
- if ( ( isObject ( val ) || isFunction ( val ) ) ) then = val && val . then ;
437
- if ( isFunction ( then ) ) {
438
- this . promise . $$state . status = - 1 ;
439
- then . call ( val , resolvePromise , rejectPromise , simpleBind ( this , this . notify ) ) ;
440
- } else {
441
- this . promise . $$state . value = val ;
442
- this . promise . $$state . status = 1 ;
443
- scheduleProcessQueue ( this . promise . $$state ) ;
444
- }
445
- } catch ( e ) {
446
- rejectPromise ( e ) ;
447
- exceptionHandler ( e ) ;
432
+ promise . $$state . value = val ;
433
+ promise . $$state . status = 1 ;
434
+ scheduleProcessQueue ( promise . $$state ) ;
448
435
}
436
+ } catch ( e ) {
437
+ doReject ( e ) ;
438
+ exceptionHandler ( e ) ;
439
+ }
449
440
450
- function resolvePromise ( val ) {
451
- if ( done ) return ;
452
- done = true ;
453
- that . $$resolve ( val ) ;
454
- }
455
- function rejectPromise ( val ) {
456
- if ( done ) return ;
457
- done = true ;
458
- that . $$reject ( val ) ;
459
- }
460
- } ,
441
+ function doResolve ( val ) {
442
+ if ( done ) return ;
443
+ done = true ;
444
+ $$resolve ( promise , val ) ;
445
+ }
446
+ function doReject ( val ) {
447
+ if ( done ) return ;
448
+ done = true ;
449
+ $$reject ( promise , val ) ;
450
+ }
451
+ function doNotify ( progress ) {
452
+ notifyPromise ( promise , progress ) ;
453
+ }
454
+ }
461
455
462
- reject : function ( reason ) {
463
- if ( this . promise . $$state . status ) return ;
464
- this . $$reject ( reason ) ;
465
- } ,
456
+ function rejectPromise ( promise , reason ) {
457
+ if ( promise . $$state . status ) return ;
458
+ $$reject ( promise , reason ) ;
459
+ }
466
460
467
- $$reject : function ( reason ) {
468
- this . promise . $$state . value = reason ;
469
- this . promise . $$state . status = 2 ;
470
- scheduleProcessQueue ( this . promise . $$state ) ;
471
- } ,
461
+ function $$reject ( promise , reason ) {
462
+ promise . $$state . value = reason ;
463
+ promise . $$state . status = 2 ;
464
+ scheduleProcessQueue ( promise . $$state ) ;
465
+ }
472
466
473
- notify : function ( progress ) {
474
- var callbacks = this . promise . $$state . pending ;
475
-
476
- if ( ( this . promise . $$state . status <= 0 ) && callbacks && callbacks . length ) {
477
- nextTick ( function ( ) {
478
- var callback , result ;
479
- for ( var i = 0 , ii = callbacks . length ; i < ii ; i ++ ) {
480
- result = callbacks [ i ] [ 0 ] ;
481
- callback = callbacks [ i ] [ 3 ] ;
482
- try {
483
- result . notify ( isFunction ( callback ) ? callback ( progress ) : progress ) ;
484
- } catch ( e ) {
485
- exceptionHandler ( e ) ;
486
- }
467
+ function notifyPromise ( promise , progress ) {
468
+ var callbacks = promise . $$state . pending ;
469
+
470
+ if ( ( promise . $$state . status <= 0 ) && callbacks && callbacks . length ) {
471
+ nextTick ( function ( ) {
472
+ var callback , result ;
473
+ for ( var i = 0 , ii = callbacks . length ; i < ii ; i ++ ) {
474
+ result = callbacks [ i ] [ 0 ] ;
475
+ callback = callbacks [ i ] [ 3 ] ;
476
+ try {
477
+ notifyPromise ( result , isFunction ( callback ) ? callback ( progress ) : progress ) ;
478
+ } catch ( e ) {
479
+ exceptionHandler ( e ) ;
487
480
}
488
- } ) ;
489
- }
481
+ }
482
+ } ) ;
490
483
}
491
- } ) ;
484
+ }
492
485
493
486
/**
494
487
* @ngdoc method
@@ -527,9 +520,9 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
527
520
* @returns {Promise } Returns a promise that was already resolved as rejected with the `reason`.
528
521
*/
529
522
var reject = function ( reason ) {
530
- var result = new Deferred ( ) ;
531
- result . reject ( reason ) ;
532
- return result . promise ;
523
+ var result = new Promise ( ) ;
524
+ rejectPromise ( result , reason ) ;
525
+ return result ;
533
526
} ;
534
527
535
528
var makePromise = function makePromise ( value , resolved ) {
@@ -579,9 +572,9 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
579
572
580
573
581
574
var when = function ( value , callback , errback , progressBack ) {
582
- var result = new Deferred ( ) ;
583
- result . resolve ( value ) ;
584
- return result . promise . then ( callback , errback , progressBack ) ;
575
+ var result = new Promise ( ) ;
576
+ resolvePromise ( result , value ) ;
577
+ return result . then ( callback , errback , progressBack ) ;
585
578
} ;
586
579
587
580
/**
@@ -617,7 +610,7 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
617
610
*/
618
611
619
612
function all ( promises ) {
620
- var deferred = new Deferred ( ) ,
613
+ var result = new Promise ( ) ,
621
614
counter = 0 ,
622
615
results = isArray ( promises ) ? [ ] : { } ;
623
616
@@ -626,18 +619,18 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
626
619
when ( promise ) . then ( function ( value ) {
627
620
if ( results . hasOwnProperty ( key ) ) return ;
628
621
results [ key ] = value ;
629
- if ( ! ( -- counter ) ) deferred . resolve ( results ) ;
622
+ if ( ! ( -- counter ) ) resolvePromise ( result , results ) ;
630
623
} , function ( reason ) {
631
624
if ( results . hasOwnProperty ( key ) ) return ;
632
- deferred . reject ( reason ) ;
625
+ rejectPromise ( result , reason ) ;
633
626
} ) ;
634
627
} ) ;
635
628
636
629
if ( counter === 0 ) {
637
- deferred . resolve ( results ) ;
630
+ resolvePromise ( result , results ) ;
638
631
}
639
632
640
- return deferred . promise ;
633
+ return result ;
641
634
}
642
635
643
636
/**
@@ -669,19 +662,19 @@ function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
669
662
throw $qMinErr ( 'norslvr' , 'Expected resolverFn, got \'{0}\'' , resolver ) ;
670
663
}
671
664
672
- var deferred = new Deferred ( ) ;
665
+ var promise = new Promise ( ) ;
673
666
674
667
function resolveFn ( value ) {
675
- deferred . resolve ( value ) ;
668
+ resolvePromise ( promise , value ) ;
676
669
}
677
670
678
671
function rejectFn ( reason ) {
679
- deferred . reject ( reason ) ;
672
+ rejectPromise ( promise , reason ) ;
680
673
}
681
674
682
675
resolver ( resolveFn , rejectFn ) ;
683
676
684
- return deferred . promise ;
677
+ return promise ;
685
678
} ;
686
679
687
680
// Let's make the instanceof operator work for promises, so that
0 commit comments