Вы можете сделать это, играя с цепочкой обещаний.
Для сериализации необходимо только реализовать функцию "next" или использовать итерацию, для параллели вы можете просто использовать Promise.all
.
Обратите внимание на «явный антипаттерн конструкции Promise», о котором говорится в комментариях, поскольку он значительно увеличивает производительность.
Это рабочий пример, с которого начинается:
const schedule = {
"scheduleA": {
"JobA": "a.bat 1000",
"JobB": "b.bat 800"
},
"scheduleB": {
"JobC": "c.js 600"
},
"scheduleC": {
"JobD": "d.js 400"
},
"scheduleD": {
"JobE": "e.bat 200",
"JobF": "f.js 0"
}
};
var wait = (job, sleepTime) => {
return new Promise(function (resolve) {
setTimeout(() => { resolve(job + ' - Completed'); }, sleepTime);
});
}
var executeSchedule = (sched, jobs) => {
console.log('Processing Schedule : ' + sched);
const stack = Object.values(jobs).map(script => {
const args = script.split(' ');
return wait(args[0], args[1])
})
return Promise.all(stack)
.then(resp => {
// NOTE: this .then is useless
console.log("After Results are: " + resp);
return resp
});
}
const start = async () => {
const serial = Object.entries(schedule)
const results = []
const next = async () => {
if (serial.length > 0) {
const [key, value] = serial.shift()
const out = await executeSchedule(key, value)
results.push(out)
return next()
}
return results
}
return next()
}
start()
.then(results => {
console.log('Response : ' + JSON.stringify(results, null, 2));
})
.catch(err => {
console.log('Error : ' + err);
});