在查询完成之前发送响应

时间:2014-06-22 04:53:07

标签: sql-server node.js

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

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

客户希望对XHR请求做出响应,并且不想等待一分半钟。它并不关心响应的内容。

查询是通过openquery的删除语句 - 它不会期待结果。

有没有办法解决这样的事情如删除语句,然后在查询完成之前返回一个响应,无论结果如何?我没有听说过这样的事情所以我不知道在哪里看,但到目前为止找不到它。

1 个答案:

答案 0 :(得分:2)

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

在你的应用程序中,你将spawn a child process来自被调用的REST / Web API函数,它负责将结果返回给客户端。此方案将解除您对删除查询的执行时间的依赖性。无论孩子进程是在2秒还是2分钟内运行,您的客户都不会知道差异,就像他/她想要的那样,结果几乎是立竿见影的。

有许多简单的样本和其他资源,例如this onethis one等。

从Nodejs运行子进程的简单代码示例:

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);
    }
 });

您可能不关心甚至不需要输入/输出/错误流,因此您的代码可能看起来更简单。像这样:

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

此部分根据以下评论添加和修改:

我知道在SQL Server中启动异步任务的唯一方法是安排查询,sproc等的执行。但这是一个丑陋的黑客。有一些本机API允许您从客户端以编程方式执行它,但您又回到了开始的位置。

在任何情况下,我建议不要在SQL中实现此功能,因为您将在UI / UX和后端之间建立紧密耦合。我不认为深入了解node.js是实现子进程解决方案所必需的。这非常简单,特别是如果你不关心结果。简单的火和忘记。

相关问题