2011-07-11 18 views
6

在這本書動手節點,筆者給出阻塞I \ O的例子,不明白回調和無阻塞的例子 - Node.js的

var post = db.query("select * from posts where id = 1"); 
doSomethingWithPost(post) 
doSomethingElse(); 

筆者說的是什麼都不執行直到1號線執行完畢分貝查詢

而且,當時他表示非阻塞代碼

callback = function(post){ 
doSomethingWithPost(post) 
} 

db.query("select * from posts where id = 1",callback); 
doSomethingElse(); 

是不是直到查詢被執行,這也阻止了?

因此,doSomethingElse將不會執行直到查詢完成。

回答

2

作者是絕對正確的。如果第二個示例是非阻塞的,則代碼執行將觸發查詢,然後繼續執行其餘的代碼。回調函數將在查詢完成後在將來的某個未確定的點處調用。將立即調用doSomethingElse();

實際上,這個例子阻塞vs非阻塞在你提供的例子中並不清楚。這將是數據庫實施的內在內容。也許通過傳入一個回調參數表明請求應該是非阻塞的。

希望有幫助, 泰勒。

+0

錯誤我還是不get..say如果'查詢(字符串,回調){// implementaion程序來檢索爲給定的查詢字符串記錄...使拿時間執行...在基於resuts fetched調用回調}'。對我來說,這也是阻塞..無數據庫被查詢回調將不會執行..將等待..正確! – prvn

2

Ryan Dahl's intro是一個很不錯的概述,但是this beginner's tutorial is excellent,它以一種友好的方式詳細解釋了Javascript(以及Node)中非阻塞操作的前提。

但是,簡而言之,您發佈的第二個示例中的回調參數在db.query完成之前不會執行,它將「繼續等待以後」,這意味着代碼位於db.query()之後。呼叫可以繼續執行。

6

您應該總是讀取像doRealStuff(params, callback)這樣的非阻塞函數作爲「將doRealStuff,params和回調放入隊列中,當達到隊列末尾時執行callback()」。這也可能有助於避免做這樣

for (var i=0; i < 1000000; i++) 
{ 
    // I want to do many http requests now 
    do_request(test_url); 
} 

// not a single byte is sent here because event loop was blocked by for loop 
+0

很好的例子:) – danjah

+1

還有一個很好的異步解釋語句,從Nodebeginner中浮動出來:「在節點中,一切都平行運行,除了你的代碼」 - http://nodebeginner.org/index.html –