如何在node.js中执行回调函数?

时间:2015-08-01 13:35:18

标签: javascript node.js callback

我刚刚开始学习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()在执行回调函数之前是否将值返回给服务器变量?它怎么能这样做,它是如何工作的?对于节点(和javascript)中的所有回调函数,它是否相同?

我只想简单解释一下执行过程。

要清楚,我知道回调函数可以访问服务器变量。但是,如果 app.listen 方法在将值返回到 server 变量之前执行回调函数,那么这并不意味着服务器当您尝试访问 server.adress()时,变量仍然未定义?这是我不明白的。

4 个答案:

答案 0 :(得分:2)

  

app.listen()在执行回调函数之前是否将值返回给服务器变量?

是的,确切地说。 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" );
});
  

它如何做到这一点以及它如何运作?对于节点(和javascript)中的所有回调函数,它是否相同?

这是因为IO events in Node.js are all run asynchronously(来自fs module的例外) - 也就是说,它们只会在其他同步代码运行完毕时发生。

这在浏览器JS中也是如此 - 如果你同步运行一些JS进程,任何触发的事件(如clickblur等)只会在完成后执行。

答案 1 :(得分:1)

一个函数可以访问创建的范围内存在的所有变量(除非它掩盖了它们)。

var in_the_global_scope = 1;
function outer() {
    function inner() {
        alert(in_the_global_scope);
    }
    inner();
}

inner可以访问innerouter和全局范围内声明的任何变量。

作为回调的功能并不是真正相关的。

listen方法本身有权访问server,因为listen是在不同的范围内创建的。

  

但是如果它返回一个值,那么它怎么能执行回调函数呢?

因为它不只是执行回调。它会等待一个事件,并且回调会因此而被触发。



var timeOutId = setTimeout(function() {
  alert(timeOutId);
}, 1000);




答案 2 :(得分:0)

将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()返回的任何内容。

答案 3 :(得分:0)

您可以这样想,app.listen()返回一个对象server,其中包含有关如何运行服务器的信息,例如portaddress,就像一篇论文说明。然后它去运行服务器。

运行服务器时,应用程序还会在该说明示例porcessid上添加一些注释 然后服务器也调用回调函数app.listen(port[, callback])。通过该功能,我们可以从指令和备注中访问服务器信息。