node.js - node.js 控制台异步应用“最佳实践”
问题描述
定期,我必须编写直接从 shell 运行的 node.js 控制台应用程序。他们不接受输入,他们会调用文件系统,进行数据库调用和其他异步类型的活动。关于如何设置托管服务器等的 node.js 应用程序的示例比比皆是,但对于调用异步进程的东西,等待它,然后在设置退出代码后退出。我很难找到我认为优雅的例子。
这是我现在如何解决这个问题的一个片段。任何 node.js 大师都有更简洁的方法来解决这个问题,或者这主要是“好的”吗?
const emitter = new EventEmitter();
emitter.on('exit', (err) => {
if(err) {
console.error(err instanceof Error ? err.message : err);
process.exit(-1);
} else {
process.exit(0);
}
});
setImmediate(async () => {
try {
await doSomeAsyncThing();
emitter.emit('exit', null);
} catch(e) {
emitter.emit('exit', e);
}
});
解决方案
这就是unhandledRejection
活动的目的。默认情况下,它会输出UnhandledPromiseRejectionWarning
并预计会在未来的 Node 版本中导致异常。由于这是这里的意图,它可以是:
process.on('unhandledRejection', (err) => {
console.error(err instanceof Error ? err.message : err);
process.exit(-1);
});
(async () => {
try {
await doSomeAsyncThing();
process.exit(0);
} catch(e) {
throw e;
}
})();
推荐阅读
- python - 字典列表的问题
- python - 在 Python multiprocessing.Process 中,我们是否必须使用 `__name__ == __main__`?
- c++ - 通过 find_if() 或迭代器之外的键访问对向量中的元素
- line - 确定一组点是否形成一条近似线
- paypal - PayPal IPN 身份验证协议是否足够安全?
- ruby - 根据出现时间 Ruby 组织唯一元素的值
- c# - 关于 C# 中的类型
- menu - Typo3 禁用活动菜单链接
- reactjs - 为活动的 navlink 类使用 react-router 尾随路径
- javascript - 如何检查单击的 svg 路径是否有类?