2014-03-04 45 views
0

我正在開發一個使用NodeJS的應用程序,其中兩個查詢相互依賴,這裏是對我的情況的解釋。在nodejs中阻止IO

我要查詢數據庫中的一些值說那我就必須查詢 數據庫爲其他值B僅如果在數據庫中的一個。

我知道我可以的NodeJS」像一個執行查詢自然的方式做到這一點時,其結果是準備在A的回調執行對於B查詢,然後終於呈現B的回調響應。

這是我的問題,是否存在我剛剛提到的有關嵌套回調的解決方案中的設計問題。

其次,有什麼方法可以使NodeJs IO成爲不阻塞的阻塞?

+0

如果阻塞IO,整個程序將無法對任何請求作出迴應所有,直到完成這些查詢。這通常不是你想要的。 – Chuck

+0

節點確實有一些提供阻塞和非阻塞版本的I/O函數 - 例如fs.readFile和fs.readFileSync。如果你的數據庫驅動程序提供了阻塞功能 - 你可以使用它。阻塞時可能需要的一個例子是節點應用程序何時啓動 - 因爲無論如何,直到初始化函數完成之前,您都不會收到任何請求。 – Svbaker

回答

2

我被告知了一個名爲Async的庫,當我啓動我的NodeJs項目時,我希望找到id。它可以處理這個等等。

異步提供大約20功能,包括通常的「功能性」 嫌疑人(地圖,減少,過濾器,每個...)以及爲異步控制流(並聯,串聯,瀑布...)的一些常見模式 。所有 這些函數假定您遵循node.js約定,即提供 單個回調作爲異步函數的最後一個參數。從現場

基本的例子,這將有助於在方案

async.series([ 
    function(callback){ 
     // do db call one 
     callback(null, 'one'); 
    }, 
    function(callback){ 
     // do db call two 
     callback(null, 'two'); 
    } 
], 
function(err, results){ 
    // results is now equal to ['one', 'two'] 
}); 
1

這是我的問題,在剛剛提到的解決方案中,是否存在一個設計問題,可能是關於嵌套回調。

不,您的解決方案非常好。

其次有沒有什麼方法可以讓NodeJs IO阻塞爲非阻塞?

是的。你可以編寫你自己的C++擴展來提供阻塞調用。