Я это сделал!
function AFlow() {
this.index = 0;
}
module.exports.AFlow = AFlow;
module.exports.run = function (jobs) {
var flow = new AFlow;
flow.jobs = jobs;
flow.doJob();
return flow;
};
AFlow.prototype.add = function (job) {
this.jobs.splice(this.index + 1, 0, job);
};
AFlow.prototype.doJob = function () {
var flow = this;
if (flow.index >= flow.jobs.length) {
return;
}
process.nextTick(function () {
flow.jobs[flow.index](function () {
flow.index++;
flow.doJob();
}, flow)
});
};
использование:
var util = require('util');
var AFlow = require('AFlow');
var data = [];
flow = AFlow.run([
function (next) {
data.push('one');
console.log(util.inspect(data));
setTimeout(next, 500);
},
function (next) {
data.push('two');
flow.add(function (next) {
data.push('three');
console.log(util.inspect(data));
setTimeout(next, 500);
});
console.log(util.inspect(data));
setTimeout(next, 500)
},
function (next) {
data.push('four');
console.log(util.inspect(data));
setTimeout(next, 500)
},
function(){
data.push('five');
console.log(util.inspect(data));
}
]);