Skip to content

Commit cbae80a

Browse files
setImediate + error handling
setImediate = +30% to speed Error handling by default = + 500% to useability
1 parent 28b53c1 commit cbae80a

File tree

1 file changed

+97
-88
lines changed

1 file changed

+97
-88
lines changed

index.js

Lines changed: 97 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,98 @@
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

Comments
 (0)