我正在创建一个应用程序,它向另一台服务器发出大量HTTP请求,完成其中一个请求可能需要1分钟。有些用户取消了请求,但我的应用仍会执行已取消的请求。
这是我的代码:
var app = express();
app.get('/something', function (req, res) {
function timeout(i) {
setTimeout(function () {
// lets assume there is a http request.
console.log(i);
timeout(++i);
}, 100);
}
req.connection.on('close', function () {
console.log('I should do something');
});
timeout(1);
});
app.listen(5000);
基本上,我想要的是在客户端关闭连接后停止console.log(i)调用。此外,如果可能,客户端会省略“close- {id}”事件,并且当后端收到close- {id}事件时,它会终止{id}请求。
注意:我使用setTimeout来显示回调函数。这不是真正的代码。
感谢您的帮助。
答案 0 :(得分:4)
从文档中,“http.request()返回http.ClientRequest类的实例。”您可以调用返回对象的abort()方法。 (警告,未经测试的代码)。
var http = require('http'); // This needs to go at the top of the file.
app.get('/something', function (req, res) {
var remote_request = http.request("www.something.com", function(data){
res.writeHeader(200, {"Content-type": "text/plain"});
res.end(data);
});
req.on("close", function() {
remote_request.abort();
});
});
答案 1 :(得分:2)
将您的setTimeout
分配给var,然后在clearTimeout
处理程序中使用close
。如果可能需要根据您的方法结构进行一些巧妙的重组,例如:
var myTimeout = setTimeout(...)
...
req.connection.on('close', function() {
clearTimeout(myTimeout);
});