I like to run a set of functions in parallel and when all are done, I like to run some final stuff. My JavaScript looks like this:
const logger = console;
const functionOne = function () {
logger.info("Starting functionOne");
return new Promise(resolve => {
setTimeout(function () {
logger.info("Finished functionOne after 20 sec.");
}, 20000);
});
};
const functionTwo = function () {
logger.info("Starting functionTwo");
return new Promise(resolve => {
setTimeout(function () {
logger.info("Finished functionTwo after 10 sec.");
}, 10000);
});
};
const runningFunctions = async function () {
logger.info('Start jobs');
functionOne();
functionTwo();
}
runningFunctions();
logger.info(`All done after 20 sec.`);
In principle my log output should be this one:
2021-11-24 16:54:31.111 [info] -> Start jobs
2021-11-24 16:54:31.112 [info] -> Starting functionOne
2021-11-24 16:54:31.113 [info] -> Starting functionTwo
2021-11-24 16:54:41.115 [info] -> Finished functionTwo after 10 sec.
2021-11-24 16:54:51.115 [info] -> Finished functionOne after 20 sec.
2021-11-24 16:54:51.116 [info] -> All done after 20 sec.
I tried different solution, e.g.
runningFunctions().then(
() => { logger.info(`All done after 20 sec.`) }
).catch(
err => { logger.error(err) }
);
or
Promise.all([functionOne(), functionTwo()]).then(() => {
logger.info(`All done after 20 sec.`);
});
and many others, but none of them worked as expected. In most cases message All done after 20 sec. comes immediately after functionOne/functionTwo started or the final log is not printed at all.
How do I have to write the script?
>Solution :
Promise.all is the way to go, but you’d need to resolve your promises
const logger = console;
const functionOne = function () {
logger.info("Starting functionOne");
return new Promise(resolve => {
setTimeout(function () {
logger.info("Finished functionOne after 20 sec.");
resolve(); // need to resolve
}, 20000);
});
};
const functionTwo = function () {
logger.info("Starting functionTwo");
return new Promise(resolve => {
setTimeout(function () {
logger.info("Finished functionTwo after 10 sec.");
resolve();
}, 10000);
});
};
Promise.all([functionOne(), functionTwo()]).then(() => {
logger.info(`All done after 20 sec.`);
});