Simple way to run any functions in queue, with pauses between jobs, priority and waiting timeouts.
Example:
'use strict';
const pdzQ = require('@pdz/q');
const log = (...args) => {
console.log.apply(null, [parseFloat(Date.now() / 1000).toFixed(1)].concat(args));
}
const q = new pdzQ({
pause: 100, // Pause between jobs
wait: 5000, // Wait for job execution
timeout: 5000, // Additional timeout if wait is exceed but job is already runned
prio: 0 // Default priority
});
// q.job(function, [conf]);
q.job(() => 'Job 1 - ok').then(log).catch(e => log(e.message));
q.job(() => 'Job 2 - ok').then(log).catch(e => log(e.message));
q.job(() => 'Job 3 - ok').then(log).catch(e => log(e.message));
q.job(() => 'Job 4 - ok').then(log).catch(e => log(e.message));
q.job(async () => {
await new Promise(pres => setTimeout(pres, 1000));
return 'Job 5 - ok';
}).then(log).catch(e => log(e.message));
q.job(async () => {
await new Promise(pres => setTimeout(pres, 10000));
return 'Job 6 - ok';
}).then(log).catch(e => log('Job 6 - error:', e.message)); // Timeout exceed
q.job(async () => {
await new Promise(pres => setTimeout(pres, 10000));
return 'Job 7 - ok';
}).then(log).catch(e => log('Job 7 - error:', e.message)); // Wait exceed
const testJob8 = async (...args) => {
await new Promise(pres => setTimeout(pres, 1000));
return 'Job 8 - ok with prio 1 and params: [' + args.join(',') + ']';
}
q.job(testJob8.bind(null, 'Param1', 'Param2'), {wait: 30000, timeout: 20000, prio: 1}).then(log).catch(e => log(e.message)); // No exceed
q.job(async () => {
await new Promise(pres => setTimeout(pres, 10000));
return 'Job 9 - ok';
}).then(log).catch(e => log('Job 9 - error:', e.message)); // Wait exceed
// 1636195520.6 Job 1 - ok
// 1636195521.7 Job 8 - ok with prio 1 and params: [Param1,Param2]
// 1636195521.8 Job 2 - ok
// 1636195521.9 Job 3 - ok
// 1636195522.0 Job 4 - ok
// 1636195523.1 Job 5 - ok
// 1636195525.6 Job 7 - error: Wait for job execution timeout exceed
// 1636195525.6 Job 9 - error: Wait for job execution timeout exceed
// 1636195530.6 Job 6 - error: Job execution timeout exceed