在查询完成之前发送响应

我有一个Web应用程序通过Node.js调用查询到SQL Server。

我想从客户端发出一个通常需要1-2秒的查询,但是在一些特殊情况下可能需要一分半钟的时间。

客户希望得到对XHR请求的响应,而不想等一分半钟。 它并不关心回应是什么。

查询是一个通过openquery的delete语句 – 它不期望返回结果。

有没有办法像delete语句一样触发这样的事情,然后在查询完成之前返回对查询的响应,无论结果如何? 我还没有听说过这样的事情,所以我不知道在哪里看,但目前还找不到。

在许多其他语言中,答案将涉及线程,但由于js不支持线程,所以您必须使用进程来创buildasynchronous返回,就像您所描述的那样。

在你的应用程序中,你会从被调用的REST / Web API函数产生一个subprocess ,并负责将结果返回给客户端。 这个scheme将解耦您对删除查询执行时间的依赖。 无论孩subprocess在2秒钟还是2分钟内运行,你的客户都不会知道差异,就像他/她想要的那样,结果看起来几乎是立即的。

有这样一个简单的样本和其他资源, 这一个等可用。

从Nodejs运行subprocess的简单代码示例:

var exec = require('child_process').exec; exec('node -v', function(error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); if (error !== null) { console.log('exec error: ' + error); } }); 

你可能不关心甚至不需要input/输出/错误stream,所以你的代码看起来更简单。 像这样的东西:

 var exec = require('child_process').exec; exec('node -v', function() { // put your delete code here }); 

本节添加和修改从下面的评论:

我知道在SQL Server中启动一个asynchronous任务的唯一方法是安排一个查询,sproc等的执行。但这是一个丑陋的黑客攻击。 有本地的API,允许你从客户端以编程方式执行,但你回到你开始的地方。

无论如何,我build议不要在SQL中实现这个function,因为你将在UI / UX和后端之间build立紧密的耦合。 而且我不认为深入探究node.js对于实现subprocess解决scheme是必要的。 这很简单,特别是如果你不关心结果。 简单的火,忘了。