dojo
Version:
Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.
100 lines (91 loc) • 2.14 kB
JavaScript
define([
'exports',
'intern/dojo/_base/lang',
'intern/dojo/_base/array',
'intern/dojo/Deferred',
'intern/dojo/errors/CancelError',
'intern/dojo/promise/Promise',
'intern/dojo/promise/all'
], function (exports, lang, array, Deferred, CancelError, DojoPromise, all) {
exports.Promise = function Promise(executor, returnDfd) {
var canceler;
var dfd = new Deferred(function (reason) {
if (canceler) {
return canceler(reason);
}
else {
return new CancelError('canceled');
}
});
try {
executor(
lang.hitch(dfd, 'resolve'),
lang.hitch(dfd, 'reject'),
lang.hitch(dfd, 'progress'),
function (_canceler) {
canceler = _canceler;
}
);
}
catch (e) {
dfd.reject(e);
}
return returnDfd ? dfd : dfd.promise;
};
exports.Promise.reject = function (error) {
var dfd = new Deferred();
dfd.reject(error);
return dfd.promise;
};
exports.Promise.resolve = function (value) {
if (value instanceof DojoPromise) {
return value;
}
if (value instanceof Deferred) {
return value.promise;
}
var dfd = new Deferred();
if (value && typeof value.then === 'function') {
value.then(
lang.hitch(dfd, 'resolve'),
lang.hitch(dfd, 'reject'),
lang.hitch(dfd, 'progress')
);
}
else {
dfd.resolve(value);
}
return dfd.promise;
};
exports.map = function (values, callback) {
return all(
array.map(values, function (value, index) {
return exports.Promise.resolve(value).then(function (value) {
return callback(value, index);
});
})
);
};
exports.delay = function (value, milliseconds) {
var promise = exports.Promise.resolve(value);
return new exports.Promise(function (resolve, reject, progress) {
setTimeout(function () {
promise.then(resolve, reject, progress);
}, milliseconds);
});
};
exports.call = function (func) {
var args = Array.prototype.slice.call(arguments, 1);
return exports.Promise(function (resolve, reject) {
args.push(function (err, value) {
if (err) {
reject(err);
}
else {
resolve(value);
}
});
func.apply(this, args);
});
};
});