@@ -4,10 +4,7 @@ define([
4
4
"./callbacks"
5
5
] , function ( jQuery , slice ) {
6
6
7
- var stdTypes = {
8
- object :true ,
9
- function :true
10
- } ;
7
+ var stdTypes = / ^ ( o b j e c t | f u n c t i o n ) $ / ;
11
8
12
9
function stdAttach ( object , fnDone , fnFail , fnProgress ) {
13
10
var then ;
@@ -18,7 +15,7 @@ function stdAttach( object, fnDone, fnFail, fnProgress ) {
18
15
. fail ( fnFail )
19
16
. progress ( fnProgress ) ;
20
17
}
21
- if ( stdTypes [ typeof object ] ) {
18
+ if ( stdTypes . test ( typeof object ) ) {
22
19
try {
23
20
if ( jQuery . isFunction ( ( then = object . then ) ) ) {
24
21
then . call ( object , fnDone , fnFail ) ;
@@ -32,20 +29,20 @@ function stdAttach( object, fnDone, fnFail, fnProgress ) {
32
29
}
33
30
}
34
31
35
- function stdCallback ( defer , callback ) {
32
+ function stdCallback ( deferred , callback ) {
36
33
return jQuery . isFunction ( callback ) && function ( value ) {
37
34
setTimeout ( function ( ) {
38
35
var returned ;
39
36
try {
40
37
returned = callback ( value ) ;
41
- if ( returned === defer . promise ( ) ) {
38
+ if ( returned === deferred . promise ( ) ) {
42
39
throw new TypeError ( ) ;
43
40
}
44
41
} catch ( e ) {
45
- return defer . reject ( e ) ;
42
+ return deferred . reject ( e ) ;
46
43
}
47
- if ( ! stdAttach ( returned , defer . resolve , defer . reject , defer . notify ) ) {
48
- defer . resolve ( returned ) ;
44
+ if ( ! stdAttach ( returned , deferred . resolve , deferred . reject , deferred . notify ) ) {
45
+ deferred . resolve ( returned ) ;
49
46
}
50
47
} ) ;
51
48
} ;
@@ -54,7 +51,7 @@ function stdCallback( defer, callback ) {
54
51
jQuery . extend ( {
55
52
56
53
Deferred :function ( func ) {
57
- var finalized , tuples = [
54
+ var tuples = [
58
55
// action, add listener, listener list, final state
59
56
[ "resolve" , "done" , jQuery . Callbacks ( "once memory" ) , "resolved" ] ,
60
57
[ "reject" , "fail" , jQuery . Callbacks ( "once memory" ) , "rejected" ] ,
@@ -110,7 +107,34 @@ jQuery.extend({
110
107
return obj != null ?jQuery . extend ( obj , promise ) :promise ;
111
108
}
112
109
} ,
113
- deferred = { } ;
110
+ deferred = { } ,
111
+ finalizerFactoryFactory = function ( ) {
112
+ var finalized ;
113
+ return function ( i , indirect ) {
114
+ return function ( _self , _args ) {
115
+ var factory ,
116
+ self = indirect ?_self :this ,
117
+ args = indirect ?_args :arguments ;
118
+ if ( ! finalized ) {
119
+ finalized = ( i < 2 ) ;
120
+ finalized = ! indirect && ! ! (
121
+ args &&
122
+ args . length === 1 &&
123
+ ( factory = finalizerFactoryFactory ( ) ) &&
124
+ stdAttach ( args [ 0 ] , factory ( 0 ) , factory ( 1 ) , factory ( 2 ) )
125
+ ) ;
126
+ if ( ! finalized ) {
127
+ tuples [ i ] [ 2 ] . fireWith (
128
+ self === deferred ?promise :self ,
129
+ args
130
+ ) ;
131
+ }
132
+ }
133
+ return this ;
134
+ } ;
135
+ } ;
136
+ } ,
137
+ finalizerFactory = finalizerFactoryFactory ( ) ;
114
138
115
139
// Add list-specific methods
116
140
jQuery . each ( tuples , function ( i , tuple ) {
@@ -130,28 +154,9 @@ jQuery.extend({
130
154
} , tuples [ i ^ 1 ] [ 2 ] . disable , tuples [ 2 ] [ 2 ] . lock ) ;
131
155
}
132
156
133
- tuple [ 4 ] = function ( ) {
134
- if ( arguments . length !== 1 || ! stdAttach (
135
- arguments [ 0 ] ,
136
- tuples [ 0 ] [ 4 ] ,
137
- tuples [ 1 ] [ 4 ] ,
138
- tuples [ 2 ] [ 4 ] ) ) {
139
- list . fireWith (
140
- this === deferred ?promise :this ,
141
- arguments
142
- ) ;
143
- }
144
- } ;
145
-
146
157
// deferred[ resolve | reject | notify ]
147
- deferred [ tuple [ 0 ] ] = function ( ) {
148
- if ( ! finalized ) {
149
- finalized = ( i < 2 ) ;
150
- tuple [ 4 ] . apply ( this , arguments ) ;
151
- }
152
- return this ;
153
- } ;
154
- deferred [ tuple [ 0 ] + "With" ] = list . fireWith ;
158
+ deferred [ tuple [ 0 ] ] = finalizerFactory ( i ) ;
159
+ deferred [ tuple [ 0 ] + "With" ] = finalizerFactory ( i , true ) ;
155
160
} ) ;
156
161
157
162
// Make the deferred a promise