这个关闭是如何工作的?

时间:2014-10-09 17:10:17

标签: javascript node.js closures

我对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变量仍然为空?

此致

2 个答案:

答案 0 :(得分:2)

  

有人可以解释为什么尽管请求成功,postData变量仍然为空?

它实际上与闭包无关,只是时间。截至记录时,请求尚未完成(甚至还没有获得单个"data"回调),因此变量没有分配任何内容。请求完成异步

以下是onRequest回调事件发生的顺序:

  1. 创建了变量postdatapathname

  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调用
  10. "end",并在最后一步创建函数。

  11. 稍后,在步骤6中可能会或可能不会对函数creaetd进行一次或多次调用。

  12. 稍后,可能会对步骤8中创建的功能进行一次调用。

答案 1 :(得分:0)

Node.js不会等待addListener函数完成。 Node将启动异步功能,然后继续执行下一行代码。在执行时postdata =''。