Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传入的Javascript回调函数参数_Javascript_Node.js_Callback - Fatal编程技术网

传入的Javascript回调函数参数

传入的Javascript回调函数参数,javascript,node.js,callback,Javascript,Node.js,Callback,我对javascript(事件驱动语言)相当陌生;我试图学习Node.js,但是回调函数把我弄糊涂了。所以我读了一些教程,然后我想我明白了,直到我问自己下面的问题。下面是一个非常简单的代码片段,我想用它来说明我的问题 var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"});

我对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接收一个参数,这个参数是回调函数定义。回调函数还需要两个参数(response和request),然后响应将写入一些内容。但是谁在回调函数中将值传递给response?在node.js中,这是由createServer默认传递的吗?我可以更改请求和响应的顺序吗?如果我的理解有误,请纠正我

谢谢您的时间。

是的,
createServer()
将传递参数,因此您无法对其重新排序

但是谁在回调函数中将值传递给response呢

如果您询问是谁向函数提供
响应
参数,答案(最简单的说法)是Node.js

如果您想在更深的代码层次上理解它,您可以检查源代码。他是:

可以看出,
requestListener
参数就是您所引用的回调。这用于实例化一个新的
服务器
实例

可以看出,
Server
构造函数是
requestListener

从这里开始,代码需要更深入地了解新请求进入时发生的一切,但至少我们可以看到服务器最终使用
req
res
参数:

self.emit('request', req, res);
由于您的
createServer()
回调已注册为请求事件的事件侦听器,因此它将接收这些参数

在node.js中,这是由createServer默认传递的吗

如上所述,是-这是默认行为

我可以更改请求和响应的顺序吗

希望从以上所有内容中可以看出这一点,但为了完整起见,“不”


编辑:为了解决您对回调的一些普遍困惑,也许这将有助于

首先,无论我们谈论的是“回调”、“事件侦听器”,还是事件编程中的任何其他常见约定,重要的是要理解,归根结底,它们都只是函数。唯一使它成为“回调”的是关于如何以及何时调用它的一组约定

旁注:在这种特殊情况下,将
createServer()
参数称为“事件侦听器”实际上更准确,因为它是在响应特定事件(请求)时被调用的


不过,无论哪种方式,都没有什么神奇的不同。在过程中的某个地方,必须有人调用该函数,调用方将提供它接收到的参数。作为回调/事件侦听器的定义者,您无法更改这些参数的提供顺序,这意味着我们只需要依赖约定和/或文档。

非常有用,谢谢Jeremy。因此,根据我对您的评论的理解,还有一个快速的问题,createserver正在侦听一些请求,如果有一个请求传入,它将被调用。我可以知道createserver和回调函数(requestListener)的执行顺序吗?在调用
createserver()
之前,没有任何东西在侦听请求。事实上,在你真正打电话之前没有人在听。一旦调用了
.listen()
,服务器实例就会在内部处理传入的请求,然后让您通过侦听器参与该过程。因此,按顺序,1)
.createServer()
,2)
.listen()
,3)[实际请求发生],4)
请求侦听器
会收到通知。而且,要明确的是,3)和4)会无限期重复。也就是说,每次传入新请求时,
requestListener
将再次被调用。无需反复调用
.createServer()
.listen()
…非常清晰且有用!一般来说,我是否可以得出结论,如果调用了父方法(无论什么条件,例如按钮单击、计时器滴答声等)并且其方法体完成,那么所有回调函数都将调用回调方法?我可能需要您定义“父方法”的含义,以便正确回答。然而,一般来说,回调被用作在某种异步操作之后重新获得控制权的一种方式。因此,基本上,您将回调传递给一些代码,这些代码反过来将执行异步操作,并且这些代码同意在回调完成后调用回调,因此您可以对结果执行任何您想执行的操作。谢谢您的回答。现在就知道了。;-)
if (requestListener) {
    this.addListener('request', requestListener);
}
self.emit('request', req, res);