2014-06-22 71 views
1

我有一個web應用程序通過Node.js向SQL Server調用查詢。在查詢完成之前發送響應

我想從客戶端發出一個查詢,通常需要1-2秒,但在某些特殊情況下可能需要長達一分半鐘的時間。

客戶端希望對XHR請求做出響應,並且不想等待一分半鐘。它並不關心迴應的內容。

該查詢是一個通過openquery的delete語句 - 它不期望返回結果。

有沒有什麼辦法可以像刪除語句一樣激發這樣的事情,然後在查詢完成之前返回對查詢的響應,而不管結果如何?我沒有聽說過這樣的事情,所以我不知道在哪裏看,但目前還找不到它。

回答

2

在許多其他語言中,答案會涉及線程,但由於js不支持線程,所以您必須使用進程來創建異步返回,就像您所描述的那樣。

在您的應用中,您將調用REST/Web API函數spawn a child process,該函數被調用並負責將結果返回給客戶端。該方案將解耦您對刪除查詢執行時間的依賴關係。無論孩子進程在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中的異步任務的唯一方法是安排查詢,存儲過程等的執行但這是一個醜陋的黑客。有本地API可以讓你從客戶端以編程的方式執行它,但是你回到了你開始的地方。

無論如何,我建議不要在SQL中實現此功能,因爲您將在UI/UX和後端之間創建緊密耦合。我不認爲深入探究node.js對於實現子進程解決方案是必要的。這非常簡單,特別是如果你不關心結果。簡單的火和忘記。

+0

好的,謝謝。這是信息。但是,這是否意味着無法在SQL級別執行此操作?我不想深入Node.js來處理它。 – dthree

+0

@ dc2:我知道在SQL Server中啓動異步任務的唯一方法是計劃查詢,sproc等的執行。但這是一個醜陋的黑客攻擊。有本地API可以讓你從客戶端以編程的方式執行它,但是你回到了你開始的地方。無論如何,我建議不要在SQL中實現此功能,因爲您將在UI/UX和後端之間創建緊密耦合。而且我不確定你有多深入Node.js來完成這個過程。這非常簡單,特別是如果你不關心結果。簡單的火和忘記。 –

+0

是的,我可能會在我的REST請求中拋出一個參數,指出「不要等待響應」。這應該相當簡單。絕對不會做這個工作日程表破解! – dthree

相關問題