UNPKG

thinknode

Version:

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

76 lines (59 loc) 2.41 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 }; } /** * 执行等待,避免一个耗时的操作多次被执行 * callback需要返回一个Promise * 常用于避免并发多次执行某个事务的场景 * @author richen * @copyright Copyright (c) 2016 - <richenlin(at)gmail.com> * @license MIT * @version 16/7/14 */ 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)); } _class.prototype.init = function init() { this.queue = {}; }; _class.prototype.run = function run(key, fn) { var _this2 = this; if (!(key in this.queue)) { this.queue[key] = []; return _promise2.default.resolve(fn()).then(function (data) { process.nextTick(function () { _this2.queue[key].forEach(function (deferred) { return deferred.resolve(data); }); delete _this2.queue[key]; }); return data; }).catch(function (err) { process.nextTick(function () { _this2.queue[key].forEach(function (deferred) { return deferred.reject(err); }); delete _this2.queue[key]; }); return THINK.error(err); }); } else { var deferred = THINK.getDefer(); this.queue[key].push(deferred); return deferred.promise; } }; return _class; }(THINK.Base); exports.default = _class;