retry.js 936 B

123456789101112131415161718192021222324252627282930313233343536
  1. var _ = require("./_");
  2. var sleep = require("./sleep");
  3. var $retryError = {};
  4. module.exports = function (initRetries, span, fn, self) {
  5. return function () {
  6. var retries = initRetries;
  7. var errs = [], args = arguments;
  8. if (_.isFunction(span)) {
  9. self = fn;
  10. fn = span;
  11. span = 0;
  12. }
  13. var countdown = _.isFunction(retries) ?
  14. retries : function () { return sleep(span, retries--); };
  15. function tryFn (isContinue) {
  16. return isContinue ? fn.apply(self, args) : _.Promise.reject($retryError);
  17. }
  18. function onError (err) {
  19. if (err === $retryError) return _.Promise.reject(errs);
  20. errs.push(err);
  21. return attempt();
  22. }
  23. function attempt () {
  24. return _.Promise.resolve(countdown(errs)).then(tryFn).catch(onError);
  25. }
  26. return attempt();
  27. };
  28. };