2011-05-09 71 views
3

我目前正在開發一個使用node.js和MySQL的API。我是新來的這個非阻塞的東西,我有一個問題。我正在使用節點和MySQL模塊。nodejs和無阻塞的噩夢

說,我們有這樣的函數:

function doQuery(sql, callback) { 
    connect(); //does the Client.connect() 
    client.query(sql, function(err, results, fields) { 
     if (err) { 
      errorLog.trace(err, __filename); 
      throw err; 
     } else { 
      logger.trace('DATABASE ACCESS: {query: ' + sql + '} result: OK', __filename); 
     } 
     client.end(); 

     callback(results); 
    }); 
} 

一切運行正常,回調處理值的迴歸,但有一些困擾我。我的瀏覽器什麼,直到響應回來,我不知道這是否是因爲在這段時間節點實際上被阻止,或不。

那麼,我怎麼知道一個操作是否真的阻塞了我的節點進程?我認爲當你將一個回調函數傳遞給一個函數時,節點會自動處理它,並將這個回調函數的執行放在事件循環的隊列中。但我實際上並不確定

這一切對你有意義嗎?

+0

我不是100%對我們的問題。你在問這個函數是否阻塞,回調是如何工作的,或者如何找到除函數之外的其他東西是阻塞的? – Robert 2011-05-09 21:05:43

+0

其實它更多的是關於如何知道什麼時候阻止了你的節點進程(在這種情況下是Http.server)。 – kaspar 2011-05-09 21:13:48

回答

15

瀏覽器等待和node.js阻止有區別。

瀏覽器必須等待,因爲它無法立即獲取數據。一旦你發送迴應,瀏覽器將停止等待。僅僅因爲瀏覽器正在等待並不意味着node.js被阻止。這僅表示連接仍處於打開狀態

Node.js在等待回調期間閒置。它不會阻止。

node.js可以與瀏覽器客戶端建立數千個打開的連接。這並不意味着它在每個人都阻止。它只是意味着它正在閒置,直到它有一個回調來處理或新的請求處理。

+0

我的天啊!那很快!非常感謝你! – kaspar 2011-05-09 21:11:43