123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- 'use strict';
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = queue;
- var _baseIndexOf = require('lodash/_baseIndexOf');
- var _baseIndexOf2 = _interopRequireDefault(_baseIndexOf);
- var _isArray = require('lodash/isArray');
- var _isArray2 = _interopRequireDefault(_isArray);
- var _noop = require('lodash/noop');
- var _noop2 = _interopRequireDefault(_noop);
- var _onlyOnce = require('./onlyOnce');
- var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
- var _setImmediate = require('./setImmediate');
- var _setImmediate2 = _interopRequireDefault(_setImmediate);
- var _DoublyLinkedList = require('./DoublyLinkedList');
- var _DoublyLinkedList2 = _interopRequireDefault(_DoublyLinkedList);
- var _wrapAsync = require('./wrapAsync');
- var _wrapAsync2 = _interopRequireDefault(_wrapAsync);
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- function queue(worker, concurrency, payload) {
- if (concurrency == null) {
- concurrency = 1;
- } else if (concurrency === 0) {
- throw new Error('Concurrency must not be zero');
- }
- var _worker = (0, _wrapAsync2.default)(worker);
- var numRunning = 0;
- var workersList = [];
- var processingScheduled = false;
- function _insert(data, insertAtFront, callback) {
- if (callback != null && typeof callback !== 'function') {
- throw new Error('task callback must be a function');
- }
- q.started = true;
- if (!(0, _isArray2.default)(data)) {
- data = [data];
- }
- if (data.length === 0 && q.idle()) {
- // call drain immediately if there are no tasks
- return (0, _setImmediate2.default)(function () {
- q.drain();
- });
- }
- for (var i = 0, l = data.length; i < l; i++) {
- var item = {
- data: data[i],
- callback: callback || _noop2.default
- };
- if (insertAtFront) {
- q._tasks.unshift(item);
- } else {
- q._tasks.push(item);
- }
- }
- if (!processingScheduled) {
- processingScheduled = true;
- (0, _setImmediate2.default)(function () {
- processingScheduled = false;
- q.process();
- });
- }
- }
- function _next(tasks) {
- return function (err) {
- numRunning -= 1;
- for (var i = 0, l = tasks.length; i < l; i++) {
- var task = tasks[i];
- var index = (0, _baseIndexOf2.default)(workersList, task, 0);
- if (index === 0) {
- workersList.shift();
- } else if (index > 0) {
- workersList.splice(index, 1);
- }
- task.callback.apply(task, arguments);
- if (err != null) {
- q.error(err, task.data);
- }
- }
- if (numRunning <= q.concurrency - q.buffer) {
- q.unsaturated();
- }
- if (q.idle()) {
- q.drain();
- }
- q.process();
- };
- }
- var isProcessing = false;
- var q = {
- _tasks: new _DoublyLinkedList2.default(),
- concurrency: concurrency,
- payload: payload,
- saturated: _noop2.default,
- unsaturated: _noop2.default,
- buffer: concurrency / 4,
- empty: _noop2.default,
- drain: _noop2.default,
- error: _noop2.default,
- started: false,
- paused: false,
- push: function (data, callback) {
- _insert(data, false, callback);
- },
- kill: function () {
- q.drain = _noop2.default;
- q._tasks.empty();
- },
- unshift: function (data, callback) {
- _insert(data, true, callback);
- },
- remove: function (testFn) {
- q._tasks.remove(testFn);
- },
- process: function () {
- // Avoid trying to start too many processing operations. This can occur
- // when callbacks resolve synchronously (#1267).
- if (isProcessing) {
- return;
- }
- isProcessing = true;
- while (!q.paused && numRunning < q.concurrency && q._tasks.length) {
- var tasks = [],
- data = [];
- var l = q._tasks.length;
- if (q.payload) l = Math.min(l, q.payload);
- for (var i = 0; i < l; i++) {
- var node = q._tasks.shift();
- tasks.push(node);
- workersList.push(node);
- data.push(node.data);
- }
- numRunning += 1;
- if (q._tasks.length === 0) {
- q.empty();
- }
- if (numRunning === q.concurrency) {
- q.saturated();
- }
- var cb = (0, _onlyOnce2.default)(_next(tasks));
- _worker(data, cb);
- }
- isProcessing = false;
- },
- length: function () {
- return q._tasks.length;
- },
- running: function () {
- return numRunning;
- },
- workersList: function () {
- return workersList;
- },
- idle: function () {
- return q._tasks.length + numRunning === 0;
- },
- pause: function () {
- q.paused = true;
- },
- resume: function () {
- if (q.paused === false) {
- return;
- }
- q.paused = false;
- (0, _setImmediate2.default)(q.process);
- }
- };
- return q;
- }
- module.exports = exports['default'];
|