【发布时间】:2021-11-25 02:07:02
【问题描述】:
我喜欢并行运行一组函数,当所有函数都完成后,我喜欢运行一些最终的东西。我的 JavaScript 看起来像这样:
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.`);
原则上我的日志输出应该是这个:
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.
我尝试了不同的解决方案,例如
runningFunctions().then(
() => { logger.info(`All done after 20 sec.`) }
).catch(
err => { logger.error(err) }
);
或
Promise.all([functionOne(), functionTwo()]).then(() => {
logger.info(`All done after 20 sec.`);
});
还有许多其他的,但没有一个按预期工作。在大多数情况下,消息 All done after 20 sec. 会在 functionOne/functionTwo 启动之后立即出现,或者根本不会打印最终日志。
如何编写脚本?
【问题讨论】:
-
Promise.all是要走的路,但你需要在你的承诺中resolve -
而且你应该先解决你的承诺
标签: javascript node.js asynchronous promise