2014-10-09 53 views
0

我沒有用JavaScript太多的經驗和我下面一個Node.js的書,它有下面的代碼這個封閉是如何工作的?

function start(route, handle) 
{ 
    function onRequest(request, response) 
    { 
     var postdata=''; 
     var pathname=url.parse(request.url).pathname; 

     request.setEncoding('utf8'); 

     request.addListener("data", function(postDataChunkd) 
     { 
     postdata+=postDataChunkd; 
     }); 

     console.log('Post data: ' + postdata);// <----------------------- HERE 

     request.addListener("end", function() 
     { 
     route(handle, pathname, response, postdata); 

     }); 
} 

http.createServer(onRequest).listen(8124); 

console.log('Server running on 8124'); 
} 

exports.start=start; 

代碼工作正常不過的事情是,對我來說這似乎是一個位隱晦的變量postData被記錄爲addListener(「data」...和addListener(「end」)中的空字符串...

有人可以解釋爲什麼postData變量記錄爲空,儘管成功請求?

Regards

+0

使用NodeJS時的一階業務就是熟悉異步編程的概念。您正在爲'data'事件添加一個偵聽器,並且清楚地知道,當您的'console.log()'運行時事件還沒有發生。 – 2014-10-09 17:13:05

+0

...將日誌*放置在事件處理程序中,您將獲得有意義的結果。 – 2014-10-09 17:14:17

+0

當然,我會更加關注異步方面。謝謝 – user3256539 2014-10-09 19:05:09

回答

2

有人能解釋爲什麼POSTDATA變量儘管成功的請求記錄是空的?

它實際上與閉包無關,只是時機。從登錄時起,請求尚未完成(或者甚至還沒有收到單個"data"回調),因此該變量尚未分配任何內容。請求異步完成

下面是其中在onRequest回調的事情發生的順序:

  1. 變量postdata並創建pathname

  2. postdata設置爲''

  3. pathname設置爲評估結果url.parse(request.url).pathname

  4. request.setEncoding被調用。

  5. 創建傳遞給第一次調用request.addListener的函數。

  6. request.addListener被調用並通過"data"字符串和在上一步中創建的函數。此時不執行功能

  7. 表達'Post data: ' + postdata進行評價時,得到'Post data: '(如postdata''),並通入console.log要被寫入到控制檯。

  8. 創建傳遞給第二次調用request.addListener的函數。

  9. request.addListener"end"一起被調用,並在最後一步創建函數。

  10. 一段時間後,在步驟6中可能有或沒有對函數creaetd進行一次或多次調用。

  11. 一段時間後,有可能會是一個調用步驟創建函數8

+1

非常感謝!現在很清楚! – user3256539 2014-10-09 18:51:03

0

Node.js的不等待的addListener函數來完成。節點將啓動異步功能,然後繼續下一行代碼。在執行postdata =''時。