promise
Advanced tools
Comparing version 2.0.0 to 3.0.0
219
index.js
@@ -1,164 +0,97 @@ | ||
var isPromise = require('is-promise') | ||
var nextTick | ||
if (typeof setImediate === 'function') nextTick = setImediate | ||
else if (typeof process === 'object' && process && process.nextTick) nextTick = process.nextTick | ||
else nextTick = function (cb) { setTimeout(cb, 0) } | ||
var extensions = [] | ||
if (typeof setImmediate === 'function') { // IE >= 10 & node.js >= 0.10 | ||
nextTick = function(fn){ setImmediate(fn) } | ||
} else if (typeof process !== 'undefined' && process && typeof process.nextTick === 'function') { // node.js before 0.10 | ||
nextTick = function(fn){ process.nextTick(fn) } | ||
} else { | ||
nextTick = function(fn){ setTimeout(fn, 0) } | ||
} | ||
module.exports = Promise | ||
function Promise(fn) { | ||
if (!(this instanceof Promise)) { | ||
return fn ? new Promise(fn) : defer() | ||
} | ||
if (typeof fn !== 'function') { | ||
throw new TypeError('fn is not a function') | ||
} | ||
if (!(this instanceof Promise)) return new Promise(fn) | ||
if (typeof fn !== 'function') throw new TypeError('not a function') | ||
var state = null | ||
var delegating = false | ||
var value = null | ||
var deferreds = [] | ||
var self = this | ||
var state = { | ||
isResolved: false, | ||
isSettled: false, | ||
isFulfilled: false, | ||
value: null, | ||
waiting: [], | ||
running: false | ||
this.then = function(onFulfilled, onRejected) { | ||
return new Promise(function(resolve, reject) { | ||
handle({ onFulfilled: onFulfilled, onRejected: onRejected, resolve: resolve, reject: reject }) | ||
}) | ||
} | ||
function _resolve(val) { | ||
resolve(state, val); | ||
function handle(deferred) { | ||
if (state === null) { | ||
deferreds.push(deferred) | ||
return | ||
} | ||
nextTick(function() { | ||
var cb = state ? deferred.onFulfilled : deferred.onRejected | ||
if (typeof cb !== 'function'){ | ||
(state ? deferred.resolve : deferred.reject)(value) | ||
return | ||
} | ||
var ret | ||
try { | ||
ret = cb(value) | ||
} | ||
catch (e) { | ||
deferred.reject(e) | ||
return | ||
} | ||
deferred.resolve(ret) | ||
}) | ||
} | ||
function _reject(err) { | ||
reject(state, err); | ||
} | ||
this.then = function _then(onFulfilled, onRejected) { | ||
return then(state, onFulfilled, onRejected); | ||
} | ||
_resolve.fulfill = deprecate(_resolve, 'resolver.fulfill(x)', 'resolve(x)') | ||
_resolve.reject = deprecate(_reject, 'resolver.reject', 'reject(x)') | ||
try { | ||
fn(_resolve, _reject) | ||
} catch (ex) { | ||
_reject(ex) | ||
function resolve(newValue) { | ||
if (delegating) | ||
return | ||
resolve_(newValue) | ||
} | ||
} | ||
function resolve(promiseState, value) { | ||
if (promiseState.isResolved) return | ||
if (isPromise(value)) { | ||
assimilate(promiseState, value) | ||
} else { | ||
settle(promiseState, true, value) | ||
} | ||
} | ||
function reject(promiseState, reason) { | ||
if (promiseState.isResolved) return | ||
settle(promiseState, false, reason) | ||
} | ||
function then(promiseState, onFulfilled, onRejected) { | ||
return new Promise(function (resolve, reject) { | ||
function done(next, skipTimeout) { | ||
var callback = promiseState.isFulfilled ? onFulfilled : onRejected | ||
if (typeof callback === 'function') { | ||
function timeoutDone() { | ||
var val | ||
try { | ||
val = callback(promiseState.value) | ||
} catch (ex) { | ||
reject(ex) | ||
return next(true) | ||
} | ||
resolve(val) | ||
next(true) | ||
function resolve_(newValue) { | ||
if (state !== null) | ||
return | ||
try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure | ||
if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.') | ||
if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { | ||
var then = newValue.then | ||
if (typeof then === 'function') { | ||
delegating = true | ||
then.call(newValue, resolve_, reject_) | ||
return | ||
} | ||
if (skipTimeout) timeoutDone() | ||
else nextTick(timeoutDone) | ||
} else if (promiseState.isFulfilled) { | ||
resolve(promiseState.value) | ||
next(skipTimeout) | ||
} else { | ||
reject(promiseState.value) | ||
next(skipTimeout) | ||
} | ||
} | ||
promiseState.waiting.push(done) | ||
if (promiseState.isSettled && !promiseState.running) processQueue(promiseState) | ||
}) | ||
} | ||
state = true | ||
value = newValue | ||
finale() | ||
} catch (e) { reject_(e) } | ||
} | ||
function processQueue(promiseState) { | ||
function next(skipTimeout) { | ||
if (promiseState.waiting.length) { | ||
promiseState.running = true | ||
promiseState.waiting.shift()(next, skipTimeout) | ||
} else { | ||
promiseState.running = false | ||
} | ||
function reject(newValue) { | ||
if (delegating) | ||
return | ||
reject_(newValue) | ||
} | ||
next(false) | ||
} | ||
function settle(promiseState, isFulfilled, value) { | ||
if (promiseState.isSettled) return | ||
function reject_(newValue) { | ||
if (state !== null) | ||
return | ||
state = false | ||
value = newValue | ||
finale() | ||
} | ||
promiseState.isResolved = promiseState.isSettled = true | ||
promiseState.value = value | ||
promiseState.isFulfilled = isFulfilled | ||
processQueue(promiseState) | ||
} | ||
function assimilate(promiseState, thenable) { | ||
try { | ||
promiseState.isResolved = true | ||
thenable.then(function (res) { | ||
if (isPromise(res)) { | ||
assimilate(promiseState, res) | ||
} else { | ||
settle(promiseState, true, res) | ||
} | ||
}, function (err) { | ||
settle(promiseState, false, err) | ||
}) | ||
} catch (ex) { | ||
settle(promiseState, false, ex) | ||
function finale() { | ||
for (var i = 0, len = deferreds.length; i < len; i++) | ||
handle(deferreds[i]) | ||
deferreds = null | ||
} | ||
} | ||
Promise.use = function (extension) { | ||
extensions.push(extension) | ||
try { fn(resolve, reject) } | ||
catch(e) { reject(e) } | ||
} | ||
function deprecate(method, name, alternative) { | ||
return function () { | ||
var err = new Error(name + ' is deprecated use ' + alternative) | ||
if (typeof console !== 'undefined' && console && typeof console.warn === 'function') { | ||
console.warn(name + ' is deprecated use ' + alternative) | ||
if (err.stack) console.warn(err.stack) | ||
} else { | ||
nextTick(function () { | ||
throw err | ||
}) | ||
} | ||
method.apply(this, arguments) | ||
} | ||
} | ||
function defer() { | ||
var err = new Error('promise.defer() is deprecated') | ||
if (typeof console !== 'undefined' && console && typeof console.warn === 'function') { | ||
console.warn('promise.defer() is deprecated') | ||
if (err.stack) console.warn(err.stack) | ||
} else { | ||
nextTick(function () { | ||
throw err | ||
}) | ||
} | ||
var resolver | ||
var promise = new Promise(function (res) { resolver = res }) | ||
return {resolver: resolver, promise: promise} | ||
} |
{ | ||
"name": "promise", | ||
"version": "2.0.0", | ||
"version": "3.0.0", | ||
"description": "Bare bones Promises/A+ implementation", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "mocha -R spec --timeout 200 --slow 99999" | ||
"test": "mocha -R spec --timeout 200 --slow 99999", | ||
"test-resolve": "mocha test/resolver-tests.js -R spec --timeout 200 --slow 999999" | ||
}, | ||
@@ -15,10 +16,7 @@ "repository": { | ||
"license": "MIT", | ||
"dependencies": { | ||
"is-promise": "~1" | ||
}, | ||
"devDependencies": { | ||
"promises-aplus-tests": "*", | ||
"mocha-as-promised": "~1.2.1", | ||
"better-assert": "~1.0.0" | ||
"better-assert": "~1.0", | ||
"mocha": "~1.9" | ||
} | ||
} |
@@ -86,1 +86,3 @@ [![Build Status](https://travis-ci.org/then/promise.png)](https://travis-ci.org/then/promise) | ||
MIT | ||
![viewcount](https://viewcount.jepso.com/count/then/promise.png) |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
0
88
6458
87
1
- Removedis-promise@~1
- Removedis-promise@1.0.1(transitive)