Envoyé par
bul
un petit appel ajax dans 'beforeunload' de addEventListener
Ça me paraît une bonne solution. En fait, ton problème venait surtout du fait que les échanges entre le client (navigateur) et le serveur (script Node) sont des échanges asynchrones. Généralement, dans une architecture web classique, on part du principe que le serveur tourne en permanence, et que les clients font leur vie ; d’ailleurs les clients sont le plus souvent sur d’autres machines.
Dans ton cas, nous avons un appel proenf.exec qui lance un processus xdg-open, qui lui-même invoque Waterfox. Je ne sais pas exactement ce qui se passe dans les entrailles de Waterfox d’un point de vue processus, mais il y a fort à parier qu’il engendre plusieurs processus ou threads enfants, puis qu’il s’arrange pour rendre la main au processus parent le plus tôt possible. On a alors deux cas de figure :
1. Waterfox n’est pas encore lancé, et alors il va prendre un certain temps pour s’initialiser. Ce n’est que mon hypothèse, mais je pense qu’il se donne le temps d’envoyer une requête HTTP GET à ton serveur avant de signaler à xdg-open qu’il a fini de se lancer, et donc avant que xdg-open signale à ton serveur Node qu’il a fini son boulot, et donc avant que proenf.exec invoque la fonction de rappel que tu lui as passée et qui contient l’instruction exit.
La requête GET est reçue par ton serveur et gérée par la route app.get('/', ...).
2. Waterfox est déjà lancé, et dans ce cas xdg-open le détecte et renvoie un code de succès quasiment tout de suite. Waterfox reçoit tout de même l’URL, mais le temps d’envoyer la requête, le serveur a déjà exécuté l’instruction exit, et donc il ne tourne plus.
Un tout petit détail : il y a deux évènements différents, 'beforeunload' et 'unload', qui signalent la fin de vie d’une page. 'beforeunload' permet de donner une chance à l’utilisateur ou utilisatrice d’annuler l’action de quitter la page avec un message du style « attention, des données non sauvegardées pourraient être perdues ». Dans ton cas, tu n’as pas besoin de ça, tu peux donc utiliser 'unload'. Certains navigateurs actuels ou futurs pourraient utiliser cette connaissance pour optimiser le déchargement de la page.
Partager