amatiasq
3/11/2015 - 11:19 AM

Solves a race condition issue on a Promise function: http://jsfiddle.net/amatiasq/zhmz8xdx/

Solves a race condition issue on a Promise function: http://jsfiddle.net/amatiasq/zhmz8xdx/

function raceCondition(fn) {
  var counter = 0;

  return function() {
    var index = ++counter;
    var prom = fn.apply(this, arguments);

    return new Promise(function(resolve, reject) {
      prom.then(function(value) {
        if (isLast()) resolve(value);
      }, function(error) {
        if (isLast()) reject(error);
      })
    });

    function isLast() {
      return index === counter;
    }
  };
}
function timeout(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, ms);
  });
}

var rcTimeout = raceCondition(timeout);

rcTimeout(1000).then(function() { console.log(1) });
rcTimeout(500) .then(function() { console.log(2) });
rcTimeout(100) .then(function() { console.log(3) });
rcTimeout(50)  .then(function() { console.log(4) });
rcTimeout(100) .then(function() { console.log(5) });

// Only output: 5