在页面更改或关闭时执行操作

时间:2015-03-23 23:21:35

标签: javascript node.js express spawn

我有一个NodeJS / Express(4.10.2)函数,它通过spawn调用外部子进程:

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
    var spawn = require('child_process').spawn;
    var java = spawn("java", ['-cp', 'lib\\*;bin', 'com.my.app.App']);
    ...
}

我想要做的是添加某种匿名函数,当页面被更改,选项卡关闭或甚至刷新时,它将被调用。简而言之,我想杀死衍生过程!

谷歌对我的研究并不好。

1 个答案:

答案 0 :(得分:1)

我要做的是在每个请求中发送一个具有唯一值的cookie,并将该值作为键存储在地图中,其值为子进程对象,以便您可以将其杀死。

然后在Javascript页面上添加unload处理程序,以使用该唯一值触发对新URL的请求,以便您执行查杀。

e.g。你的快递代码就像:

var javaSessions = {
    _counter: -1
};
app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
    var spawn = require('child_process').spawn;
    var javaSessionId = javaSessions._counter++;
    res.cookie('java_session_id', javaSessionId);
    var java = spawn("java", ['-cp', 'lib\\*;bin', 'com.my.app.App']);
    javaSessions[javaSessionId] = java;
    ...
});
app.get('/unload/:id', function (req, res) {
    var java = javaSessions[req.params.id];
    javaSessions[req.params.id] = null;
    java.kill();
});

然后在index.html中,在底部添加以下标记(假设您不需要定位早于Internet Explorer 8的浏览器):

<script type="text/javascript">
window.onunload = function () {
    var req = new XMLHttpRequest(),
        javaSessionId = document.cookie.replace(/(?:(?:^|.*;\s*)java_session_id\s*\=\s*([^;]*).*$)|^.*$/, "$1"); // regex from https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_.232.3A_Get_a_sample_cookie_named_test2
    req.open("GET", "/unload/" + javaSessionId);
};
</script>

您也可以从请求中获取cookie值,而不是需要在Javascript中显式读取它并将其作为URL参数发送。它可能已经与请求一起发送。

您将需要测试所有这些,这是您必须自己尝试的所有非常假设的代码。