我是javascript的新手 - 事件驱动的语言;我正在尝试学习Node.js,但回调函数让我很困惑。所以我读了一些教程,然后我想我得到它,直到我问自己以下问题。这是一个非常简单的代码片段,我想用它来说明我的问题。
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
我的问题是:createServer接收一个参数,而这个参数是一个回调函数定义。回调函数还需要两个参数(响应和请求),然后响应将写入一些东西。但谁将值传递给回调函数中的 响应 ?这是默认情况下在node.js中由createServer传递的吗?我可以更改请求和响应的顺序吗?如果我的理解是错误的,请纠正我。
感谢您的时间。
答案 0 :(得分:3)
但谁将值传递给回调函数中的响应?
如果你问谁为你的函数提供了response
参数,那么答案(用最简洁的术语来说)就是Node.js.
如果您想在更深层次的代码级别理解它,可以检查源代码。他是definition for http.createServer()
:
exports.createServer = function(requestListener) {
return new Server(requestListener);
};
可以看出,requestListener
参数是您所指的回调。这用于实例化新的Server
实例。
Server
构造函数为defined in the same file,可以看出,requestListener
gets registered as an event listener for the 'request' event:
if (requestListener) {
this.addListener('request', requestListener);
}
从那里开始,代码需要更深入地了解新请求进入时发生的所有事情,但至少我们可以看到服务器最终emits the request event req
和{{ 1}}参数:
res
由于您的self.emit('request', req, res);
回调已被注册为请求事件的事件侦听器,因此它会接收这些参数。
这是由createServer在node.js中传递的吗?
如上所述,是 - 这是默认行为。
我可以更改请求和响应的顺序吗?
希望从上述所有内容中可以看出这一点,但为了完整起见,“不”。
编辑:为了解决你对回调的一些困惑,也许这会有所帮助......
首先,无论我们是在讨论“回调”,“事件监听器”,还是在事件编程中的任何其他常见惯例,重要的是要理解在一天结束时,他们都只是功能。使它成为“回调”的唯一因素是关于它如何以及何时被调用的一系列约定。
旁注:在这种特殊情况下,将createServer()
参数称为“事件监听器”实际上更准确,因为它会响应特定事件(请求)而被调用的
答案 1 :(得分:0)
是的,createServer()
会传递参数,因此您无法重新排序。