thinknode
Version:
A fast, flexible and all-in-one web framework for node.js.
76 lines (59 loc) • 2.41 kB
JavaScript
;
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;