2012-09-29 121 views
0

我知道Node.js通過使用事件循環具有事件驅動的異步回調的概念。Node.js - 執行傳遞給另一個函數的匿名函數

database.query("SELECT * FROM hugetable", function(rows) { var result = rows; }); 
console.log("Hello World"); 

在這裏,而不是期待database.query()的結果直接返回給我們,我們把它傳遞第二個參數,匿名函數。 現在,Node.js可以異步處理數據庫請求。假設database.query()是異步庫的一部分,這就是Node.js所做的:和以前一樣,它將查詢發送到數據庫。但是不要等待它完成,它會讓人記住一句話:「在將來某個時刻數據庫服務器完成併發送查詢結果時,我必須執行傳遞給它的匿名函數database.query()「。

我想同一個示例代碼(因爲我是一個新手,沒有達到直到Node.js的DB交互):

[[email protected]]# cat server8.js 
function myfun(noparm , afterend) 
{ 
     for (var i =0; i < 10; i ++) 
       console.log("The valus is " + i); 
} 

function mynextfn() 
{ 
     console.log("Hello World"); 
} 
function afterend() 
{ 
     console.log("Hello afterend"); 
} 

myfun(0, afterend); 
mynextfn(); 
[[email protected] example]# node server8.js 
The valus is 0 
The valus is 1 
The valus is 2 
The valus is 3 
The valus is 4 
The valus is 5 
The valus is 6 
The valus is 7 
The valus is 8 
The valus is 9 
Hello World 
[[email protected]]# 

因此我不看「的概念,事件驅動,異步回調,利用事件循環「?

任何人都可以請幫我實施一些基本的例子嗎?

回答

0

你把afterend函數作爲參數,但你永遠不會調用它。

你的功能myfun必須是:

function myfun(noparm , afterend) 
{ 
    for (var i = 0; i < 10; i++) { 
    console.log("The valus is " + i); 
    } 
    afterend(); 
} 

然後,你希望會發生什麼;-)

而且到:第二件事是,你myfun功能是完全同步的。所以Node.js沒有機會在myfun函數的內容之前運行mynextfn

潛在afterend將在myfun之前運行,這取決於時間問題,因爲兩者都沒有任何繁重的工作。

+0

謝謝 - 請解釋你的意思是「myfun函數是完全同步的,所以Node.js沒有機會在myfun函數的內容之前運行mynextfn。」 – Prakash

+0

我想說的是,myfun不會將任何東西委託給另一個以異步方式執行某些操作的函數,例如I/O。它只是一個循環在主(單個)線程中運行。 –

相關問題