spex
Version:
Specialized Promise Extensions
80 lines (70 loc) • 2.12 kB
JavaScript
'use strict';
/////////////////////////////////////
// Simpler check for null/undefined;
function isNull(value) {
return value === null || value === undefined;
}
///////////////////////////////////////////
// Check if the value is a promise object;
function isPromise(value) {
return value && value.then instanceof Function;
}
/////////////////////////////////////////////////////
// Sets a read-only enumerable property on an object.
function property(obj, name, value) {
Object.defineProperty(obj, name, {
value: value,
enumerable: true,
writable: false
});
}
/////////////////////////////////////////////////////
// Extends an object with a non-enumerable read-only
// method or property.
function extend(obj, name, value) {
Object.defineProperty(obj, name, {
value: value,
enumerable: false,
writable: false
});
}
/////////////////////////////////////////////////////
// Resolves a mixed value into the actual value,
// consistent with the way mixed values are defined:
// https://github.com/vitaly-t/spex/wiki/Mixed-Values
function resolve(value, params, onSuccess, onError) {
var self = this,
delayed = false;
function loop() {
while (value instanceof Function) {
try {
value = params ? value.apply(self, params) : value.call(self);
} catch (e) {
onError(e);
return;
}
}
if (isPromise(value)) {
value
.then(function (data) {
delayed = true;
value = data;
loop();
}, function (reason) {
onError(reason);
});
} else {
onSuccess(value, delayed);
}
}
loop();
}
module.exports = function (/*config*/) {
return {
isNull: isNull,
isPromise: isPromise,
property: property,
extend: extend,
resolve: resolve
};
};