UNPKG

thinknode

Version:

A fast, flexible and all-in-one web framework for node.js.

148 lines (119 loc) 3.94 kB
'use strict'; exports.__esModule = true; var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * 并行处理 * 用于大量数据需要并发执行的场景 * @author richen * @copyright Copyright (c) 2015 - <richenlin(at)gmail.com> * @license MIT * @version 15/12/8 */ var _class = function (_THINK$Base) { (0, _inherits3.default)(_class, _THINK$Base); function _class() { (0, _classCallCheck3.default)(this, _class); return (0, _possibleConstructorReturn3.default)(this, _THINK$Base.apply(this, arguments)); } /** * limit * @param {[type]} limit [] * @param {Function} callback [] * @return {[type]} [] */ _class.prototype.init = function init(limit, callback) { if (THINK.isFunction(limit)) { callback = limit; limit = 0; } this.limit = limit || 10; this.index = 0; this.doing = 0; this.callback = callback; this.deferreds = []; }; /** * add item data * @param {data} item [] */ _class.prototype.add = function add(item) { var deferred = THINK.getDefer(); deferred.data = item; this.deferreds.push(deferred); this.run(); return deferred.promise; }; /** * add many data once * @param {Array} dataList [data array] */ _class.prototype.addMany = function addMany(dataList, ignoreError) { var _this2 = this; if (!dataList || dataList.length === 0) { return _promise2.default.resolve(); } dataList.forEach(function (item) { return _this2.add(item); }); var promises = this.deferreds.map(function (deferred) { //ignore erros if (ignoreError) { return deferred.promise.catch(function () { return; }); } return deferred.promise; }); return _promise2.default.all(promises); }; /** * run * @return {} [] */ _class.prototype.run = function run() { var _this3 = this; if (this.doing >= this.limit || this.index >= this.deferreds.length) { return null; } this.doing++; var item = this.deferreds[this.index++]; var callback = THINK.isFunction(item.data) ? item.data : this.callback; if (!THINK.isFunction(callback)) { return THINK.error('data item or callback must be a function'); } var result = callback(item.data); if (!THINK.isPromise(result)) { result = _promise2.default.resolve(result); } return result.then(function (data) { _this3.next(); //resolve item item.resolve(data); }).catch(function (err) { _this3.next(); //reject item item.reject(err); }); }; /** * next * @return {Function} [description] */ _class.prototype.next = function next() { this.doing--; //reduce deferreds avoid memory leak when use single item data this.deferreds.splice(this.index - 1, 1); this.index--; this.run(); }; return _class; }(THINK.Base); exports.default = _class;