node.js中的回调函数是如何执行的?
How are callback functions executed in node.js?
我刚开始学习 node.js 和表达,在 express.js 网站上的 "hello world" 示例中有些东西让我有点困惑。在示例中,它们引用回调函数中的服务器变量。
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('App listening at http://%s:%s', host, port);
});
app.listen()
return 是否在执行回调函数之前向服务器变量赋值?它如何做到这一点以及它是如何工作的?这对节点(和javascript)中的所有回调函数都一样吗?
我想简单说明一下执行过程
明确地说,我知道回调函数可以访问服务器变量。但是如果 app.listen 方法在它 return 为 server 变量赋值之前执行回调函数,不会这意味着当您尝试访问 server.adress() 时,server 变量仍然未定义?这是我不明白的。
函数可以访问存在于创建范围内的所有变量(除非它屏蔽了它们)。
var in_the_global_scope = 1;
function outer() {
function inner() {
alert(in_the_global_scope);
}
inner();
}
inner
可以访问在 inner
、outer
和全局范围内声明的任何变量。
作为回调的函数并不真正相关。
listen
方法本身 无法访问 server
,因为 listen
是在不同的范围内创建的。
But if it returns a value, how can it then execute the callback function?
因为它不只是执行回调。它等待一个事件,然后触发回调以响应该事件。
var timeOutId = setTimeout(function() {
alert(timeOutId);
}, 1000);
正在将 var 服务器分配给函数 app.listen()
如果您查看 express 文档,它指出
The app.listen() method is a convenience method for the following (for HTTP only):
app.listen = function() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
通过设置 var server = app.listen() 和 app.listen() return 的事实,您实际上是将 var server 设置为 app.listen ()return.
你可以这样想,app.listen()
return 一个对象 server
其中包含如何 运行 服务器的信息,示例 port
, address
,就像一张说明书。然后它转到 运行 服务器。
当服务器 运行 时,应用程序还会在该指令示例上添加一些注释 porcessid
然后服务器也调用回调函数app.listen(port[, callback])
。通过该功能,我们可以从指令和备注中访问服务器信息。
Does app.listen() return a value to server variable before it executes the callback function?
是的,没错。 app.listen()
类似于 plain Node.js server.listen
method。
回调是为服务器分配 listening
事件侦听器的快捷方式。
您可以使用以下代码执行相同的操作:
var server = app.listen( 3000 );
server.on( "listening", function () {
console.log( "server is listening in port 3000" );
});
How can it do that and how does it work? Is this the same for all callback functions in node (and javascript)?
发生这种情况是因为 IO events in Node.js are all run asynchronously (with exceptions from the fs
module) - 也就是说,它们只会在其他同步代码完成 运行.
时发生
这在浏览器 JS 中同样有效 - 如果你 运行 某些 JS 同步处理,任何触发的事件(如 click
、blur
等)只会在该事件之后执行完成。
我刚开始学习 node.js 和表达,在 express.js 网站上的 "hello world" 示例中有些东西让我有点困惑。在示例中,它们引用回调函数中的服务器变量。
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('App listening at http://%s:%s', host, port);
});
app.listen()
return 是否在执行回调函数之前向服务器变量赋值?它如何做到这一点以及它是如何工作的?这对节点(和javascript)中的所有回调函数都一样吗?
我想简单说明一下执行过程
明确地说,我知道回调函数可以访问服务器变量。但是如果 app.listen 方法在它 return 为 server 变量赋值之前执行回调函数,不会这意味着当您尝试访问 server.adress() 时,server 变量仍然未定义?这是我不明白的。
函数可以访问存在于创建范围内的所有变量(除非它屏蔽了它们)。
var in_the_global_scope = 1;
function outer() {
function inner() {
alert(in_the_global_scope);
}
inner();
}
inner
可以访问在 inner
、outer
和全局范围内声明的任何变量。
作为回调的函数并不真正相关。
listen
方法本身 无法访问 server
,因为 listen
是在不同的范围内创建的。
But if it returns a value, how can it then execute the callback function?
因为它不只是执行回调。它等待一个事件,然后触发回调以响应该事件。
var timeOutId = setTimeout(function() {
alert(timeOutId);
}, 1000);
正在将 var 服务器分配给函数 app.listen()
如果您查看 express 文档,它指出
The app.listen() method is a convenience method for the following (for HTTP only):
app.listen = function() {
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
通过设置 var server = app.listen() 和 app.listen() return 的事实,您实际上是将 var server 设置为 app.listen ()return.
你可以这样想,app.listen()
return 一个对象 server
其中包含如何 运行 服务器的信息,示例 port
, address
,就像一张说明书。然后它转到 运行 服务器。
当服务器 运行 时,应用程序还会在该指令示例上添加一些注释 porcessid
然后服务器也调用回调函数app.listen(port[, callback])
。通过该功能,我们可以从指令和备注中访问服务器信息。
Does app.listen() return a value to server variable before it executes the callback function?
是的,没错。 app.listen()
类似于 plain Node.js server.listen
method。
回调是为服务器分配 listening
事件侦听器的快捷方式。
您可以使用以下代码执行相同的操作:
var server = app.listen( 3000 );
server.on( "listening", function () {
console.log( "server is listening in port 3000" );
});
How can it do that and how does it work? Is this the same for all callback functions in node (and javascript)?
发生这种情况是因为 IO events in Node.js are all run asynchronously (with exceptions from the fs
module) - 也就是说,它们只会在其他同步代码完成 运行.
这在浏览器 JS 中同样有效 - 如果你 运行 某些 JS 同步处理,任何触发的事件(如 click
、blur
等)只会在该事件之后执行完成。