@@ -204,6 +204,9 @@ function qFactory(nextTick, exceptionHandler) {
204
204
deferred = {
205
205
206
206
resolve : function ( val ) {
207
+ if ( val === deferred ) {
208
+ throw new TypeError ( ) ;
209
+ }
207
210
if ( pending ) {
208
211
var callbacks = pending ;
209
212
pending = undefined ;
@@ -214,7 +217,9 @@ function qFactory(nextTick, exceptionHandler) {
214
217
var callback ;
215
218
for ( var i = 0 , ii = callbacks . length ; i < ii ; i ++ ) {
216
219
callback = callbacks [ i ] ;
217
- value . then ( callback [ 0 ] , callback [ 1 ] , callback [ 2 ] ) ;
220
+ if ( typeof value . then === 'function' ) {
221
+ value . then . call ( value , callback [ 0 ] , callback [ 1 ] , callback [ 2 ] ) ;
222
+ }
218
223
}
219
224
} ) ;
220
225
}
@@ -223,6 +228,9 @@ function qFactory(nextTick, exceptionHandler) {
223
228
224
229
225
230
reject : function ( reason ) {
231
+ if ( reason === deferred || reason === deferred . promise ) {
232
+ throw new TypeError ( ) ;
233
+ }
226
234
deferred . resolve ( reject ( reason ) ) ;
227
235
} ,
228
236
@@ -277,7 +285,7 @@ function qFactory(nextTick, exceptionHandler) {
277
285
if ( pending ) {
278
286
pending . push ( [ wrappedCallback , wrappedErrback , wrappedProgressback ] ) ;
279
287
} else {
280
- value . then ( wrappedCallback , wrappedErrback , wrappedProgressback ) ;
288
+ value . then . call ( value , wrappedCallback , wrappedErrback , wrappedProgressback ) ;
281
289
}
282
290
283
291
return result . promise ;
@@ -331,7 +339,16 @@ function qFactory(nextTick, exceptionHandler) {
331
339
332
340
333
341
var ref = function ( value ) {
334
- if ( value && isFunction ( value . then ) ) return value ;
342
+ if ( value && isFunction ( value ) || typeof value === 'object' ) {
343
+ var then ;
344
+ try {
345
+ if ( then = value . then && typeof then === 'function' ) {
346
+ return value ;
347
+ }
348
+ } catch ( e ) {
349
+ return reject ( e ) ;
350
+ }
351
+ }
335
352
return {
336
353
then : function ( callback ) {
337
354
var result = defer ( ) ;
@@ -343,7 +360,6 @@ function qFactory(nextTick, exceptionHandler) {
343
360
} ;
344
361
} ;
345
362
346
-
347
363
/**
348
364
* @ngdoc
349
365
* @name ng.$q#reject
@@ -380,6 +396,7 @@ function qFactory(nextTick, exceptionHandler) {
380
396
* @returns {Promise } Returns a promise that was already resolved as rejected with the `reason`.
381
397
*/
382
398
var reject = function ( reason ) {
399
+ console . log ( 'reject' , reason ) ;
383
400
return {
384
401
then : function ( callback , errback ) {
385
402
var result = defer ( ) ;
0 commit comments