promiscuous
Advanced tools
Comparing version 0.2.0 to 0.3.0
@@ -5,5 +5,4 @@ #!/usr/bin/env node | ||
var minified = UglifyJS.minify("promiscuous.js", { | ||
output: { comments: true } | ||
}).code; | ||
var copyright = fs.readFileSync("promiscuous.js", "utf8").match(/.*\n/)[0]; | ||
var minified = copyright + UglifyJS.minify("promiscuous.js").code; | ||
@@ -10,0 +9,0 @@ var path = "dist/"; |
{ | ||
"name": "promiscuous", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "A minimal and fast promise/deferred implementation", | ||
@@ -5,0 +5,0 @@ "author": "Ruben Verborgh <ruben.verborgh@gmail.com>", |
@@ -1,9 +0,36 @@ | ||
/** @license MIT - ©2013 Ruben Verborgh */ | ||
/** @license MIT - promiscuous library - ©2013 Ruben Verborgh */ | ||
(function () { | ||
var func = "function", | ||
noop = function () {}; | ||
var func = "function"; | ||
// Creates a deferred: an object with a promise and corresponding resolve/reject methods | ||
function createDeferred() { | ||
var handler, | ||
changeState, | ||
// The `handler` variable points to the function that will | ||
// 1) handle a .then(onFulfilled, onRejected) call | ||
// 2) handle a .resolve or .reject call (if not fulfilled) | ||
// Before 2), `handler` holds a queue of callbacks. | ||
// After 2), `handler` is a simple .then handler. | ||
// We use only one function to save memory and complexity. | ||
var handler = function (onFulfilled, onRejected, value) { | ||
// Case 1) handle a .then(onFulfilled, onRejected) call | ||
if (onFulfilled !== handler) { | ||
var d = createDeferred(); | ||
handler.c.push({ d: d, resolve: onFulfilled, reject: onRejected }); | ||
return d.promise; | ||
} | ||
// Case 2) handle a .resolve or .reject call | ||
// (`onFulfilled` acts as a sentinel) | ||
// The actual function signature is | ||
// .re[ject|solve](sentinel, success, value) | ||
var action = onRejected ? 'resolve' : 'reject'; | ||
for (var i = 0, l = handler.c.length; i < l; i++) { | ||
var c = handler.c[i], deferred = c.d, callback = c[action]; | ||
if (typeof callback !== func) | ||
deferred[action](value); | ||
else | ||
execute(callback, value, deferred); | ||
}; | ||
// Replace this handler with a simple resolved or rejected handler | ||
handler = createHandler(promise, value, onRejected); | ||
}, | ||
promise = { | ||
@@ -14,30 +41,14 @@ then: function (onFulfilled, onRejected) { | ||
}; | ||
// The queue of deferreds | ||
handler.c = []; | ||
(function () { | ||
var pending = []; | ||
handler = function (onFulfilled, onRejected) { | ||
var d = createDeferred(); | ||
pending.push({ d: d, resolve: onFulfilled, reject: onRejected }); | ||
return d.promise; | ||
}; | ||
changeState = function (action, value, success) { | ||
for (var i = 0, l = pending.length; i < l; i++) { | ||
var p = pending[i], deferred = p.d, callback = p[action]; | ||
if (typeof callback !== func) | ||
deferred[action](value); | ||
else | ||
execute(callback, value, deferred); | ||
} | ||
handler = createHandler(promise, value, success); | ||
changeState = noop; | ||
}; | ||
})(); | ||
return { | ||
resolve: function (value) { changeState('resolve', value, true); }, | ||
reject : function (reason) { changeState('reject', reason, false); }, | ||
promise: promise | ||
promise: promise, | ||
// Only resolve / reject when there is a deferreds queue | ||
resolve: function (value) { handler.c && handler(handler, true, value); }, | ||
reject : function (reason) { handler.c && handler(handler, false, reason); } | ||
}; | ||
} | ||
// Creates a fulfilled or rejected .then function | ||
function createHandler(promise, value, success) { | ||
@@ -48,3 +59,3 @@ return function (onFulfilled, onRejected) { | ||
return promise; | ||
process.nextTick(execute.bind(promise, callback, value, result = createDeferred())); | ||
execute(callback, value, result = createDeferred()); | ||
return result.promise; | ||
@@ -54,16 +65,21 @@ }; | ||
// Executes the callback with the specified value, | ||
// resolving or rejecting the deferred | ||
function execute(callback, value, deferred) { | ||
try { | ||
var result = callback(value); | ||
if (result && typeof result.then === func) | ||
result.then(deferred.resolve, deferred.reject); | ||
else | ||
deferred.resolve(result); | ||
} | ||
catch (error) { | ||
deferred.reject(error); | ||
} | ||
process.nextTick(function () { | ||
try { | ||
var result = callback(value); | ||
if (result && typeof result.then === func) | ||
result.then(deferred.resolve, deferred.reject); | ||
else | ||
deferred.resolve(result); | ||
} | ||
catch (error) { | ||
deferred.reject(error); | ||
} | ||
}); | ||
} | ||
module.exports = { | ||
// Returns a resolved promise | ||
resolve: function (value) { | ||
@@ -74,2 +90,3 @@ var promise = {}; | ||
}, | ||
// Returns a rejected promise | ||
reject: function (reason) { | ||
@@ -80,4 +97,5 @@ var promise = {}; | ||
}, | ||
// Returns a deferred | ||
deferred: createDeferred | ||
}; | ||
})(); |
# promiscuous | ||
<a href="http://promises-aplus.github.com/promises-spec"> | ||
<img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png" | ||
alt="Promises/A+ logo" title="Promises/A+ 1.0 compliant" align="right" /> | ||
</a> | ||
promiscuous is a JavaScript promise/deferred implementation, implementing the [Promises/A+ spec](http://promises-aplus.github.com/promises-spec/). | ||
@@ -3,0 +8,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
7543
116
59