Sau khi chơi xung quanh với câu trả lời khác, đây là giải pháp của tôi cho nhiệm vụ này. Thực hiện theo cách này giúp tôi tập trung dọn dẹp ở một nơi, ngăn chặn việc xử lý gấp đôi việc dọn dẹp.
- Tôi muốn định tuyến tất cả các mã thoát khác đến mã 'thoát'.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Những gì exitRouter làm là gọi process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- Trên 'exit', xử lý dọn dẹp với một chức năng mới
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Đối với mục đích demo, đây là liên kết đến ý chính của tôi. Trong tệp, tôi thêm một setTimeout để giả mạo quá trình đang chạy.
Nếu bạn chạy node node-exit-demo.jsvà không làm gì thì sau 2 giây, bạn sẽ thấy nhật ký:
The service is finish after a while.
ExitCode 0
Exiting finally...
Khác nếu trước khi dịch vụ kết thúc, bạn chấm dứt bởi ctrl+C, bạn sẽ thấy:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Điều đã xảy ra là quá trình Node ban đầu được thoát với mã SIGINT, sau đó nó định tuyến đến process.exit () và cuối cùng đã thoát với mã thoát 0.