Tak więc chciałem uruchomić polecenie powłoki na końcu mojego programu node.js i czekać na wyjście/wydrukować je przed wyjściem. Próbowałem process.on('exit',function(){})
i uruchomiłem polecenie child exec, ale program został zakończony przed wywołaniem zwrotnym. Zamiast tego użyłem zamknięcia na process.exit, ale otrzymuję dziwne wyniki. Podstawy kodu:Proces przechwytywania Node.js
process.exit = (function(old_exit){
return function(code){
var exec = require('child_process').exec;
var child;
child = exec("my shell command", function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
console.log(stdout);
//I first had this as the concluding line:
old_exit.apply(process,arguments);
//and I also tried
old_exit.apply(process,[]);
//and even (which I know is not in the right scope)
old_exit(code);
//and also
process.exit = old_exit;
process.exit(code);
});
}
}(process.exit));
Każdy z powyższych wyników wykonał moją komendę powłoki dokładnie dwa razy, a następnie zakończył działanie. Próbowałem też nie wywoływać czegokolwiek na końcu i podczas gdy trzymałem to tak, że moje polecenie zostało wykonane tylko raz, proces zawiesił się zamiast wyjść na końcu. O ile nie ma czegoś, czego po prostu brakuje, mam wrażenie, że pierwsza próba, jaką miałem old_exit.apply(process,arguments);
, byłaby poprawna i nie powinien ponownie wywoływać mojego własnego kodu. Próbowałem również używanych obietnic, które nie działały (nawet nie spowodowało błędu, aby zostać rozwiązany wiele razy) i próbowałem użyć boolean dla, jeśli został ustawiony, ale to też nie działa. W końcu próbowałam nawet rzucić błąd po zakończeniu wywołania zwrotnego, ale ten wymuszony process.exit będzie wywoływany ponownie po błędzie. Jakieś pomysły?
kiedyś 'WYPŁYNIĘCIE zdarzenie zostało przeładowane, pętla zdarzenie nie jest już uruchomiony, więc nie można nic asynchroniczne z' WYPŁYNIĘCIE zwrotnego zrobić. – ebohlman
To jest zrozumiałe, ale czy jest jakiś inny sposób na to? – jayarjo
Mimo, że jest już stary i już go nie potrzebuję, nie próbowałem zrobić czegoś asynch z wywołania wyjścia, próbowałem uniknąć tego ograniczenia, przechwytując process.exit wywoływanie samego siebie, abym mógł wykonać mój asynch a następnie zainicjować rzeczywisty process.exit, który nie pozwoli stamtąd asynch. Chociaż nietestowane myślę, że przynajmniej jeden z powyższych może być właściwym rozwiązaniem i faktycznie był to konflikt z ramą testową mokki, który również wykonywał specjalne działania wyjścia procesu, które powodowały moje szczególne problemy. – user1084563