easyflow
Easy workflow engine with status and messaging utilities, for javascript.
Easyflow provides a centralized view for workflow definition. It provides clear and robust workflow by
moving flow dependency out from business logic unit.
const Easyflow = require('./easyflow.js')
const util = require('util')
const MySubFlow = require('./MySubFlow.js')
const MyBigTask = require('./MyBigTask.js')
Promise.resolve()
.then(demo1)
.then(demo2)
.then(demo3)
.then(demo4)
.then(demo5)
.then(demo6)
.then(() => {
console.log('Demo complete')
}).catch((e) => {
console.log('Demo error:', e)
})
function demo1() {
console.log()
console.log('-------------------- demo1: basic --------------------')
console.log()
return new Easyflow().sequence(
task1,
task2,
task3
).parallel(
task4,
task5,
task6
).sequence(
task7,
task8
).run('my initial param for the first task')
.then((result) => {
console.log('Success. Result:', result)
})
}
function demo2() {
console.log()
console.log('-------------------- demo2: nested task --------------------')
console.log()
let flow = new Easyflow()
return flow.sequence(
task1,
task2,
task3
).parallel(
task4,
flow.sequence(task5, task6, task7),
flow.sequence(task8, task9)
).sequence(
task10,
flow.parallel(
flow.sequence(task11, task12),
flow
.sequence(task13, task14, task15)
.sequence(task16, task17),
flow.sequence(task18, task19)
),
task20
).run()
}
function demo3() {
console.log()
console.log('-------------------- demo3: Status --------------------')
console.log()
let flow = new Easyflow()
flow.sequence('Major task 1',
task1,
task2,
task3
).parallel('Major task 2 (parallel)',
task4,
flow.sequence(task5, task6, task7),
flow.sequence(task8, task9)
).sequence('Major task 3',
task10,
flow.parallel(
flow.sequence(task11, task12),
flow
.sequence('Named subtask 4', task13, task14, task15)
.sequence('Named subtask 5', task16, task17),
flow.sequence(task18, task19)
),
task20
)
let status = flow.status()
console.log('Status', util.inspect(status, null, 4))
flow.onStatus((id, name, status) => {
console.log('onStatus: name=' + name + ', id=' + id + ', status=' + status)
})
return flow.run().then((result) => {
console.log('Status', util.inspect(status, null, 4))
})
}
function demo4() {
console.log()
console.log('-------------------- demo4: nested easyflow, and task class --------------------')
console.log()
let subflow = MySubFlow()
let flow = new Easyflow().sequence('Demo nested easyflow & task class',
task1,
MyBigTask,
subflow,
task3
)
return flow.run().then(() => {
console.log('Status:', util.inspect(flow.status(), null, 4))
})
}
function demo5() {
console.log()
console.log('-------------------- demo5: nested status --------------------')
console.log()
let flow = new Easyflow()
flow.sequence('DemoMessage',
task101,
task102,
flow.sequence(task103, task104),
task105
)
let status = flow.status()
console.log('Status:', status)
let n = 0
let timer = setInterval(() => {
console.log(status)
if (++n == 6)
clearInterval(timer)
}, 1000)
return flow.run()
}
function demo6() {
console.log()
console.log('---------- demo6: disable tasks ----------')
console.log()
let subflow = MySubFlow().id('myNestedFlow')
function demo6func1() {
this.workflow
.disable(task6)
.enable(task7)
}
return new Easyflow().sequence(
task1,
task2
).parallel(
task3,
task4
).id('myStep2')
.sequence(
task5,
MyBigTask,
subflow,
demo6func1,
task6,
task7
).disable(task2, task5, task7, 'myStep2', MyBigTask, 'myNestedFlow')
.run()
}