@@ -44,8 +44,9 @@ var WeakMap = require("weak-map");
44
44
var iterate = require ( "pop-iterate" ) ;
45
45
var asap = require ( "asap" ) ;
46
46
47
+ var typeOfObject = "object" ;
47
48
function isObject ( value ) {
48
- return value === Object ( value ) ;
49
+ return value !== null && typeof value === typeOfObject ;
49
50
}
50
51
51
52
// long stack traces
@@ -63,7 +64,7 @@ function makeStackTraceLong(error, promise) {
63
64
error . stack . indexOf ( STACK_JUMP_SEPARATOR ) === - 1
64
65
) {
65
66
var stacks = [ ] ;
66
- for ( var p = promise ; ! ! p && handlers . get ( p ) ; p = handlers . get ( p ) . became ) {
67
+ for ( var p = promise ; p instanceof Promise && p . _handler ; p = p . _handler . became ) {
67
68
if ( p . stack ) {
68
69
stacks . unshift ( p . stack ) ;
69
70
}
@@ -178,33 +179,22 @@ function deprecate(callback, name, alternative) {
178
179
179
180
// end of long stack traces
180
181
181
- var handlers = new WeakMap ( ) ;
182
-
182
+ // When a deferred promise is forwarded to another promise, the old handler
183
+ // becomes the new handler and all messages past and present flow to the next
184
+ // handler.
183
185
function Q_getHandler ( promise ) {
184
- var handler = handlers . get ( promise ) ;
185
- if ( ! handler || ! handler . became ) {
186
- return handler ;
186
+ var handler = promise . _handler ;
187
+ while ( handler && handler . became ) {
188
+ handler = handler . became ;
187
189
}
188
- handler = follow ( handler ) ;
189
- handlers . set ( promise , handler ) ;
190
+ promise . _handler = handler ;
190
191
return handler ;
191
192
}
192
193
193
- function follow ( handler ) {
194
- if ( ! handler . became ) {
195
- return handler ;
196
- } else {
197
- handler . became = follow ( handler . became ) ;
198
- return handler . became ;
199
- }
200
- }
201
-
202
194
var theViciousCycleError = new Error ( "Can't resolve a promise with itself" ) ;
203
195
var theViciousCycleRejection = Q_reject ( theViciousCycleError ) ;
204
196
var theViciousCycle = Q_getHandler ( theViciousCycleRejection ) ;
205
197
206
- var thenables = new WeakMap ( ) ;
207
-
208
198
/**
209
199
* Coerces a value to a promise. If the value is a promise, pass it through
210
200
* unaltered. If the value has a `then` method, it is presumed to be a promise
@@ -223,10 +213,7 @@ function Q(value) {
223
213
if ( Q_isPromise ( value ) ) {
224
214
return value ;
225
215
} else if ( isThenable ( value ) ) {
226
- if ( ! thenables . has ( value ) ) {
227
- thenables . set ( value , new Promise ( new Thenable ( value ) ) ) ;
228
- }
229
- return thenables . get ( value ) ;
216
+ return new Promise ( new Thenable ( value ) ) ;
230
217
} else {
231
218
return new Promise ( new Fulfilled ( value ) ) ;
232
219
}
@@ -329,7 +316,7 @@ function Q_all(questions) {
329
316
} else {
330
317
++ countDown ;
331
318
promise = Q ( promise ) ;
332
- promise . then (
319
+ promise . done (
333
320
function Q_all_eachFulfilled ( value ) {
334
321
answers [ index ] = value ;
335
322
if ( -- countDown === 0 ) {
@@ -630,7 +617,7 @@ function Promise(handler) {
630
617
deferred . reject ( error ) ;
631
618
}
632
619
}
633
- handlers . set ( this , handler ) ;
620
+ this . _handler = handler ;
634
621
}
635
622
636
623
/**
@@ -677,7 +664,7 @@ Promise.reject = Q_reject;
677
664
*/
678
665
Q . isPromise = Q_isPromise ;
679
666
function Q_isPromise ( object ) {
680
- return isObject ( object ) && ! ! handlers . get ( object ) ;
667
+ return isObject ( object ) && object instanceof Promise ;
681
668
}
682
669
683
670
/**
@@ -1358,7 +1345,7 @@ Pending.prototype.become = function Pending_become(promise) {
1358
1345
var handler = Q_getHandler ( promise ) ;
1359
1346
this . became = handler ;
1360
1347
1361
- handlers . set ( promise , handler ) ;
1348
+ promise . _handler = handler ;
1362
1349
this . promise = void 0 ;
1363
1350
1364
1351
this . messages . forEach ( function Pending_become_eachMessage ( message ) {
0 commit comments