forever.js
 1  'use strict';
 2  
 3  Object.defineProperty(exports, "__esModule", {
 4      value: true
 5  });
 6  
 7  var _onlyOnce = require('./internal/onlyOnce');
 8  
 9  var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
10  
11  var _ensureAsync = require('./ensureAsync');
12  
13  var _ensureAsync2 = _interopRequireDefault(_ensureAsync);
14  
15  var _wrapAsync = require('./internal/wrapAsync');
16  
17  var _wrapAsync2 = _interopRequireDefault(_wrapAsync);
18  
19  var _awaitify = require('./internal/awaitify');
20  
21  var _awaitify2 = _interopRequireDefault(_awaitify);
22  
23  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24  
25  /**
26   * Calls the asynchronous function `fn` with a callback parameter that allows it
27   * to call itself again, in series, indefinitely.
28  
29   * If an error is passed to the callback then `errback` is called with the
30   * error, and execution stops, otherwise it will never be called.
31   *
32   * @name forever
33   * @static
34   * @memberOf module:ControlFlow
35   * @method
36   * @category Control Flow
37   * @param {AsyncFunction} fn - an async function to call repeatedly.
38   * Invoked with (next).
39   * @param {Function} [errback] - when `fn` passes an error to it's callback,
40   * this function will be called, and execution stops. Invoked with (err).
41   * @returns {Promise} a promise that rejects if an error occurs and an errback
42   * is not passed
43   * @example
44   *
45   * async.forever(
46   *     function(next) {
47   *         // next is suitable for passing to things that need a callback(err [, whatever]);
48   *         // it will result in this function being called again.
49   *     },
50   *     function(err) {
51   *         // if next is called with a value in its first parameter, it will appear
52   *         // in here as 'err', and execution will stop.
53   *     }
54   * );
55   */
56  function forever(fn, errback) {
57      var done = (0, _onlyOnce2.default)(errback);
58      var task = (0, _wrapAsync2.default)((0, _ensureAsync2.default)(fn));
59  
60      function next(err) {
61          if (err) return done(err);
62          if (err === false) return;
63          task(next);
64      }
65      return next();
66  }
67  exports.default = (0, _awaitify2.default)(forever, 2);
68  module.exports = exports['default'];