JSFiddle - React, Tailwind, and code Playground

by Yu I.

HTML

<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<p id="test">Hello</p>

JavaScript

var promisify = function (func) {
  var funcPartial = function () {
    var funcArgs = _.toArray(arguments);
    var dfr = new $.Deferred(), promiseArgs = [ dfr.resolve, dfr.reject ];
    var timeoutId = setTimeout(function () {
      clearTimeout(timeoutId);
      func.apply(undefined, _.union(promiseArgs, funcArgs));
    }, 1);
    return dfr.promise();
  };
  return funcPartial;
};

retried = promisify(function (resolve, reject, done, duration, start) {
  if (!_.isNumber(start)) start = +(new Date());
  return done()
  .then(resolve, function (err) {
    var stop = +(new Date());
    if (duration <= stop - start) {
      reject(err);
    } else {
      return retried(done, duration, start);
    }
  });
});

$(function () {

  var $el = $('#test');

  function api (message) {
    return $.ajax('/echo/json/', {
      method: 'POST',
      data: { json: JSON.stringify({ message: message }), delay: 6000 },
      timeout: 1000
    });
  }
  
  retried(_.bind(api, undefined, 'Hello, world.'), 3000)
  .then(function (dat) {
    $el.text(dat.message);
  }, function (err) {
    if (err instanceof Error) $el.css('color', 'red');
    $el.text(err.message);
  });

});