Po przeanalizowaniu innej odpowiedzi, oto moje rozwiązanie tego zadania. Implementacja w ten sposób pomaga mi scentralizować czyszczenie w jednym miejscu, zapobiegając podwójnemu wykonywaniu czyszczenia.
- Chciałbym przekierować wszystkie pozostałe kody wyjścia do kodu „wyjścia”.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- To, co robi exitRouter, wywołuje proces.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- Przy „wyjściu” zajmuj się czyszczeniem za pomocą nowej funkcji
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Dla celów demonstracyjnych jest to link do mojej treści. W pliku dodaję setTimeout, aby sfałszować uruchomiony proces.
Jeśli biegniesz node node-exit-demo.jsi nic nie robisz, po 2 sekundach zobaczysz dziennik:
The service is finish after a while.
ExitCode 0
Exiting finally...
W przeciwnym razie, jeśli przed zakończeniem usługi zakończysz, ctrl+Czobaczysz:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
To, co się wydarzyło, to proces węzła początkowo zakończony kodem SIGINT, następnie kieruje się do process.exit (), a na koniec kończy się kodem wyjścia 0.