enb
Version:
Faster BEM/BEViS assembler
57 lines (51 loc) • 1.78 kB
JavaScript
/**
* Configurable
* ============
*/
var inherit = require('inherit');
var Vow = require('vow');
/**
* Configurable — базовый для классов, конфигурируемых коллбэками.
* @name Configurable
*/
module.exports = inherit(/** @lends Configurable.prototype */ {
/**
* Конструктор.
*/
__constructor: function () {
this._chains = [];
},
/**
* Добавляет коллбэк конфигурации.
* @param {Function} cb
*/
addChain: function (cb) {
this._chains.push(cb);
return this;
},
/**
* Алиас к addChain.
* @param {...Function} cb
*/
configure: function () {
return this.addChain.apply(this, arguments);
},
/**
* Выполняет цепочку коллбэков-конфигураторов.
* В случае, если конфигуратор возвращает промис, выполнение происходит асинхронно.
* @param {Object[]} args Аргументы, которые надо передавать в кажджый конфигуратор.
* @param {Object} ctxObject Контекст выполнения. Передается первым параметром в конфигураторы.
* @returns {Promise|undefined}
*/
exec: function (args, ctxObject) {
args = [ctxObject || this].concat(args || []);
var chains = this._chains.slice(0);
function keepRunning() {
var chain = chains.shift();
return chain && Vow.when(chain.apply(this, args)).then(function () {
return keepRunning();
});
}
return keepRunning();
}
});