如何让节点的关闭事件完全取消获取请求?

时间:2014-05-19 22:10:52

标签: node.js

好的,所以我发现那里有一个关闭'当用户关闭浏览器或进入差异页面时,在服务器有机会回复之前,ajax获取请求的事件。但是,即使用户关闭了浏览器,该关闭事件也不会停止,它只会发送该事件并继续在函数内部工作。我想要的是整个doWork功能在用户关闭浏览器时完全停止。但是,节点只是继续在函数内部进行工作,即使用户不再存在......

function doWork(req, res)
{
     req.on('close', function(err) {
        console.log("USER CLOSED BROWSER!!!");
        return; // but it doesn't really return....
     });

     // io process
     // cpu process
     // another io process
     // another cpu process
     // etc...

     res.json(newdata);


}

但我如何阻止一切?我会做点什么:

function doWork(req, res)
{
     var stopit = false;
     req.on('close', function(err) {
        stopit = true;
     });

     if (stopit) return;
     // io process

     if (stopit) return;
     // cpu process

     if (stopit) return;
     // another io process

     if (stopit) return;
     // another cpu process
     // etc...

     res.json(newdata);
}

即,在每次新的回调之前,我应该检查一下是否应该停止,但这看起来有点乱。是不是有办法自动停止一切?

1 个答案:

答案 0 :(得分:0)

你当然可以在节点中对它进行编码,这在技术上肯定是可行的,但是正如你的伪代码所表明的那样,它肯定不是自动的,有点干扰和代码不优雅。也许在npm上有一些优雅的模块来帮助解决这个问题(可能使用域名作为跟踪上下文的机制),但如果是这样的话,我还没有看到它或任何关于它的博客或推文。据我所知,没有人这样做过。节点程序员工作,因此他们的应用程序每秒可以提供1000个请求。中止已经接受并开始处理的请求的好处通常不是很高,因此我看到在生产节点应用程序中根本没有人关心这个问题。这种情况的所有实际处理都是由操作系统的TCP堆栈通过libuv来处理的,所以它自动"自动"从这个意义上来说,在请求关闭后进行额外处理并不会导致任何运行时错误,但除了node.js之外的其他通用目的还不足以让所有计算都在响应中完成。因为没有自动的方式让节点知道"哦,这个数据库查询旨在提供数据来响应这个已经关闭的特定网络请求,所以让我绕过那个&# 34。

相关问题