Skip to content

Commit afe90e6

Browse files
Merge pull request #9 from nathan7/fix-delegation
Fix delegation
2 parents 9a4f38f + d74fadc commit afe90e6

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

index.js

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ function Promise(fn) {
66
if (!(this instanceof Promise)) return new Promise(fn)
77
if (typeof fn !== 'function') throw new TypeError('not a function')
88
var state = null
9+
, delegating = false
910
, value = null
10-
, resolved = false
1111
, deferreds = []
1212

1313
this.then = function(onFulfilled, onRejected) {
@@ -40,10 +40,17 @@ function Promise(fn) {
4040
}
4141

4242
function resolve(newValue) {
43+
if (delegating)
44+
return
45+
resolve_(newValue)
46+
}
47+
48+
function resolve_(newValue) {
4349
if (state !== null)
4450
return
4551
if (isPromise(newValue)) {
46-
newValue.then(resolve, reject)
52+
delegating = true
53+
newValue.then(resolve_, reject_)
4754
return
4855
}
4956
state = true
@@ -52,6 +59,12 @@ function Promise(fn) {
5259
}
5360

5461
function reject(newValue) {
62+
if (delegating)
63+
return
64+
reject_(newValue)
65+
}
66+
67+
function reject_(newValue) {
5568
if (state !== null)
5669
return
5770
state = false
@@ -65,14 +78,6 @@ function Promise(fn) {
6578
deferreds = null
6679
}
6780

68-
function ifUnResolved(fn) {
69-
return function (value) {
70-
if (resolved) return
71-
resolved = true
72-
return fn(value)
73-
}
74-
}
75-
76-
try { fn(ifUnResolved(resolve), ifUnResolved(reject)) }
77-
catch(e) { ifUnResolved(reject)(e) }
81+
try { fn(resolve, reject) }
82+
catch(e) { reject(e) }
7883
}

0 commit comments

Comments
 (0)