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.";
    });