如何在node.js中执行callback函数?
我刚刚开始学习node.js,并且在express.js网站上的“hello world”示例中出现了一些令我困惑的东西。 在这个例子中,他们引用了callback函数中的服务器variables。
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()
在执行callback函数之前是否向服务器variables返回一个值? 它如何做到这一点,它是如何工作的? 节点(和JavaScript)中的所有callback函数都是一样的吗?
我只想简单地解释执行过程。
要清楚,我明白,callback函数有权访问服务器variables。 但是,如果app.listen方法在向服务器variables返回一个值之前执行callback函数,那么当您尝试访问server.adress()时,是不是表示服务器variables仍然未定义? 那是我不明白的。
app.listen()在执行callback函数之前是否向服务器variables返回一个值?
对,就是这样。 app.listen()
类似于普通的Node.js server.listen
方法 。 callback函数是将侦听器分配给listening
事件的快捷方式。
你可以用下面的代码做同样的事情:
var server = app.listen( 3000 ); server.on( "listening", function () { console.log( "server is listening in port 3000" ); });
它如何做到这一点,它是如何工作的? 节点(和JavaScript)中的所有callback函数都是一样的吗?
发生这种情况是因为Node.js中的IO事件全部是asynchronous运行的 ( fs
模块有exception), fs
,只有在其他同步代码运行完毕时才会发生。
这在浏览器JS中是一样的 – 如果你同步运行一些JS进程,任何触发的事件(比如click
, blur
等)只会在完成之后执行。
一个函数可以访问它所创build的范围内的所有variables(除非它掩盖了它们)。
var in_the_global_scope = 1; function outer() { function inner() { alert(in_the_global_scope); } inner(); }
inner
可以访问任何在inner
, outer
和全局范围inner
声明的variables。
作为callback的函数并不真正相关。
listen
方法本身不具有对server
访问权限,因为listen
是在不同的范围内创build的。
但是,如果它返回一个值,它怎么能执行callback函数呢?
因为它不只是执行callback。 它等待一个事件,callback被解雇了。
var timeOutId = setTimeout(function() { alert(timeOutId); }, 1000);
var服务器被分配给函数app.listen()
如果你看看快递文件,它表示
app.listen()方法是以下方法的一种简便方法(仅适用于HTTP):
app.listen = function() { var server = http.createServer(this); return server.listen.apply(server, arguments); };
通过设置var server = app.listen()和app.listen()返回一些事实,你本质上是将var服务器设置为app.listen()返回的值。
你可以这样想, app.listen()
返回一个包含如何运行服务器的信息的对象服务器,例如port
, address
,就像一个指令说明一样。 然后去运行服务器。
当服务器运行时,应用程序还在该指令示例中添加了一些注释,例如,服务器也是调用callback函数app.listen(port[, callback])
。 有了这个function,我们可以从指令和备注中获取服务器信息。