我对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变量仍然为空?
此致
丹
答案 0 :(得分:2)
有人可以解释为什么尽管请求成功,postData变量仍然为空?
它实际上与闭包无关,只是时间。截至记录时,请求尚未完成(甚至还没有获得单个"data"
回调),因此变量没有分配任何内容。请求完成异步。
以下是onRequest
回调事件发生的顺序:
创建了变量postdata
和pathname
。
postdata
设置为''
。
pathname
设置为评估url.parse(request.url).pathname
的结果。
request.setEncoding
被调用。
创建了传递给request.addListener
第一次调用的函数。
request.addListener
被调用并传递"data"
字符串和最后一步创建的函数。此时功能未执行。
评估表达式'Post data: ' + postdata
,产生'Post data: '
(postdata
为''
),并传递到console.log
以写入控制台。
创建了传递给request.addListener
第二次调用的函数。
request.addListener
调用 "end"
,并在最后一步创建函数。
稍后,在步骤6中可能会或可能不会对函数creaetd进行一次或多次调用。
稍后,可能会对步骤8中创建的功能进行一次调用。
答案 1 :(得分:0)
Node.js不会等待addListener函数完成。 Node将启动异步功能,然后继续执行下一行代码。在执行时postdata =''。