2014-10-09 79 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 =''时。