我有一个通过Node.js调用SQL Server查询的Web应用程序。
我想从客户端发出一个通常需要1-2秒的查询,但在某些特殊情况下可能需要一到一分钟。
客户希望对XHR请求做出响应,并且不想等待一分半钟。它并不关心响应的内容。
查询是通过openquery的删除语句 - 它不会期待结果。
有没有办法解决这样的事情如删除语句,然后在查询完成之前返回一个响应,无论结果如何?我没有听说过这样的事情所以我不知道在哪里看,但到目前为止找不到它。
答案 0 :(得分:2)
在许多其他语言中,答案将涉及线程,但由于js不支持线程,因此您必须使用进程来创建asynch返回,就像您描述的那样。
在你的应用程序中,你将spawn a child process来自被调用的REST / Web API函数,它负责将结果返回给客户端。此方案将解除您对删除查询的执行时间的依赖性。无论孩子进程是在2秒还是2分钟内运行,您的客户都不会知道差异,就像他/她想要的那样,结果几乎是立竿见影的。
有许多简单的样本和其他资源,例如this one和this 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是实现子进程解决方案所必需的。这非常简单,特别是如果你不关心结果。简单的火和忘记。