gpt4 book ai didi

javascript - 这个关闭是如何运作的?

转载 作者:行者123 更新时间:2023-12-02 16:54:32 25 4
gpt4 key购买 nike

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

问候

最佳答案

Could someone explain why the postData variable is logged empty despite a successful request?

这实际上与闭包无关,只是时间安排。截至记录时,请求尚未完成(甚至没有收到单个 "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 使用 "end" 和上一步中创建的函数调用。

  10. 一段时间后,第 6 步中可能会或可能不会对函数 createtd 进行一次或多次调用。

  11. 一段时间后,可能会调用第 8 步中创建的函数。

关于javascript - 这个关闭是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26284173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com