1- var isPromise = require ( 'is-promise' )
2-
3- var extensions = [ ] ;
4-
5- module . exports = Promise
6- function Promise ( fn ) {
7- if ( ! ( this instanceof Promise ) ) {
8- return typeof fn === 'function' ? new Promise ( fn ) : defer ( )
9- }
10- var isResolved = false
11- var isFulfilled = false
12- var value
13- var waiting = [ ]
14- var running = false
15-
16- function next ( skipTimeout ) {
17- if ( waiting . length ) {
18- running = true
19- waiting . shift ( ) ( skipTimeout || false )
20- } else {
21- running = false
22- }
23- }
24- this . then = then ;
25- function then ( cb , eb ) {
26- return new Promise ( function ( resolver ) {
27- function done ( skipTimeout ) {
28- var callback = isFulfilled ? cb : eb
29- if ( typeof callback === 'function' ) {
30- function timeoutDone ( ) {
31- var val ;
32- try {
33- val = callback ( value )
34- } catch ( ex ) {
35- resolver . reject ( ex )
36- return next ( )
37- }
38- resolver . fulfill ( val ) ;
39- next ( true ) ;
40- }
41- if ( skipTimeout ) timeoutDone ( )
42- else setTimeout ( timeoutDone , 0 )
43- } else if ( isFulfilled ) {
44- resolver . fulfill ( value )
45- next ( skipTimeout )
46- } else {
47- resolver . reject ( value )
48- next ( skipTimeout )
49- }
50- }
51- waiting . push ( done )
52- if ( isResolved && ! running ) next ( )
53- } ) ;
54- }
55-
56- ( function ( ) {
57- function fulfill ( val ) {
58- if ( isResolved ) return
59- if ( isPromise ( val ) ) val . then ( fulfill , reject )
60- else {
61- isResolved = isFulfilled = true
62- value = val
63- next ( )
64- }
65- }
66- function reject ( err ) {
67- if ( isResolved ) return
68- isResolved = true
69- isFulfilled = false
70- value = err
71- next ( )
72- }
73- var resolver = { fulfill : fulfill , reject : reject } ;
74- for ( var i = 0 ; i < extensions . length ; i ++ ) {
75- extensions [ i ] ( this , resolver ) ;
76- }
77- if ( typeof fn === 'function' ) {
78- fn ( resolver )
79- }
80- } ( ) ) ;
81- }
82- function defer ( ) {
83- var resolver
84- var promise = new Promise ( function ( res ) { resolver = res } )
85- return { resolver : resolver , promise : promise }
86- }
87- Promise . use = function ( extension ) {
88- extensions . push ( extension ) ;
1+ var isPromise = require ( 'is-promise' )
2+
3+ var nextTick ;
4+ if ( typeof setImediate === 'function' ) nextTick = setImediate
5+ else if ( typeof process === 'object' && process && process . nextTick ) nextTick = process . nextTick
6+ else nextTick = function ( cb ) { setTimeout ( cb , 0 ) }
7+
8+ var extensions = [ ] ;
9+
10+ module . exports = Promise
11+ function Promise ( fn ) {
12+ if ( ! ( this instanceof Promise ) ) {
13+ return typeof fn === 'function' ? new Promise ( fn ) : defer ( )
14+ }
15+ var isResolved = false
16+ var isFulfilled = false
17+ var value
18+ var waiting = [ ]
19+ var running = false
20+
21+ function next ( skipTimeout ) {
22+ if ( waiting . length ) {
23+ running = true
24+ waiting . shift ( ) ( skipTimeout || false )
25+ } else {
26+ running = false
27+ }
28+ }
29+ this . then = then ;
30+ function then ( cb , eb ) {
31+ return new Promise ( function ( resolver ) {
32+ function done ( skipTimeout ) {
33+ var callback = isFulfilled ? cb : eb
34+ if ( typeof callback === 'function' ) {
35+ function timeoutDone ( ) {
36+ var val ;
37+ try {
38+ val = callback ( value )
39+ } catch ( ex ) {
40+ resolver . reject ( ex )
41+ return next ( )
42+ }
43+ resolver . fulfill ( val ) ;
44+ next ( true ) ;
45+ }
46+ if ( skipTimeout ) timeoutDone ( )
47+ else nextTick ( timeoutDone )
48+ } else if ( isFulfilled ) {
49+ resolver . fulfill ( value )
50+ next ( skipTimeout )
51+ } else {
52+ resolver . reject ( value )
53+ next ( skipTimeout )
54+ }
55+ }
56+ waiting . push ( done )
57+ if ( isResolved && ! running ) next ( )
58+ } ) ;
59+ }
60+
61+ ( function ( ) {
62+ function fulfill ( val ) {
63+ if ( isResolved ) return
64+ if ( isPromise ( val ) ) val . then ( fulfill , reject )
65+ else {
66+ isResolved = isFulfilled = true
67+ value = val
68+ next ( )
69+ }
70+ }
71+ function reject ( err ) {
72+ if ( isResolved ) return
73+ isResolved = true
74+ isFulfilled = false
75+ value = err
76+ next ( )
77+ }
78+ var resolver = { fulfill : fulfill , reject : reject } ;
79+ for ( var i = 0 ; i < extensions . length ; i ++ ) {
80+ extensions [ i ] ( this , resolver ) ;
81+ }
82+ if ( typeof fn === 'function' ) {
83+ try {
84+ fn ( resolver )
85+ } catch ( ex ) {
86+ resolver . reject ( ex ) ;
87+ }
88+ }
89+ } ( ) ) ;
90+ }
91+ function defer ( ) {
92+ var resolver
93+ var promise = new Promise ( function ( res ) { resolver = res } )
94+ return { resolver : resolver , promise : promise }
95+ }
96+ Promise . use = function ( extension ) {
97+ extensions . push ( extension ) ;
8998} ;
0 commit comments