promise.any
by scotthannen
HTML
<div id="firstPromise">Waiting... just a moment</div>
JavaScript
Promise.deferred = function () {
var result = {};
result.promise = new Promise(function (resolve, reject) {
result.resolve = resolve;
result.reject = reject;
});
return result;
};
Promise.any = function (promises) {
return new Promise(function (resolve, reject) {
var count = promises.length, resolved = false;
var errors = [];
promises.forEach(function (p) {
Promise.resolve(p).then(function (value) {
resolved = true;
count--;
resolve(value);
}, function (e) {
errors.push(e);
count--;
if (count === 0 && !resolved) {
reject(errors);
}
});
});
});
};
var RandomlyDelayedPromise = function (name) {
return new Promise(function (resolve, reject) {
window.setTimeout(function () {
if (Math.random() > 0.7) {
resolve(name);
} else {
reject("Failure");
}
},
Math.random() * 5000);
});
};
var myDeferred = new Promise.deferred();
Promise.any([
new RandomlyDelayedPromise("A"),
new RandomlyDelayedPromise("B"),
new RandomlyDelayedPromise("C"),
new RandomlyDelayedPromise("D")
])
.then(function (name) {
myDeferred.resolve("Promise " + name + " resolved first!");
}).catch(function(errors) {
myDeferred.reject(errors);
});
myDeferred.promise.then(function (firstPromise) {
document.getElementById("firstPromise").textContent = firstPromise;
}).catch(function (errors) {
document.getElementById("firstPromise").textContent = "All of the promises were rejected.";
});