Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function Person(){
this.id = id;
};
Person.prototype = new events.EventEmitter;
Person.prototype.saveData = function(data, callback){
this.saveFile( 'person_' + this.id, callback);
};
Person.prototype.getData = function(type, callback){};
Person.prototype.setState = function(state, data, callback) {
switch (state) {
case 'saveDataInFile':
this.saveData(data, callback);
break;
}
this._state = state;
};
this.on('setState', onSetState);
function Actions(instance) {
var self = this;
this.nextState = function (error, data) {
if (error) {
instance.emit('error', error);
return;
}
self.currentState = self.actions.shift();
if (self.currentState) {
/* Здесь может быть генерация события или вызов callback-а.
К примеру, каждое действие может быть описано объектом,
включающим в себя имя, данные и callback, если это необходимо. */
instance.setState(self.currentState, data, self.nextState);
/*
Либо так, если реализуется через событие setState:
instance.emit('setState', data, self.nextState);
*/
} else { // Закончили цикл действий.
delete self.currentState;
self.callback && self.callback(data, instance);
delete self.callback;
}
};
}
Actions.prototype.run = function () {
arguments = [].prototype.slice.call(arguments);
if (typeof arguments[arguments.length - 1] == 'function') {
this.callback = arguments.pop();
}
this.actions = arguments;
process.nextTick(this.nextState);
};
var user = new Person('id');
user.on('error', function(error) {}); // Обработка ошибок на любом этапе выполнения.
var userActions = new Actions(user);
userActions.run('getDataFromDB', 'getDataFromDB2', 'saveDataInFile', function(data, user) {});
function onNextState (intance, actions) {
actions // Экземпляр конструктора Actions
instance // Объект, обрабатываемый объектом actions
return {}; // Данные, которые будут переданы в instance
}userActions.run({
name: 'getDataFromDB',
callback: onNextState
}, function(data, user) {});userActions.on('nextState', onNextState);
Последовательный вызов асинхронных функций