2014-10-07 48 views
0

我正在处理nodeschool.io的learnyounode http client exercise节点流:未通过回调函数a值

这是任务:

编写执行HTTP GET请求给你提供给 URL作为第一个命令行参数的程序。将每个“数据”事件的字符串内容 从响应写入控制台 (stdout)上的新行。

我的解决办法是:

var http = require("http"); 
var url = process.argv[2]; 


http.get(url, function(res){ 
    res.setEncoding('utf8'); 

    res.on('data', function(data){ 
     console.log(data); 

    }) 
}); 

这个工作,但我很好奇,为什么建议的解决方案工作。 console.log和console.error如何使用dataerror对象。它们似乎没有传递给回调函数。

var http = require('http') 

http.get(process.argv[2], function (response) { 
    response.setEncoding('utf8') 
    response.on('data', console.log) 
    response.on('error', console.error) 
}) 
+2

在这两种情况下,您都会传递一个接收和打印文本的函数。在第一个中,它是一个匿名函数,它调用'console.log',在第二个函数中它*是*'console.log'。两种方式中,'data'结束被传递给'console.log'。 – 2014-10-07 16:43:33

回答

0

使用response.on('data', console.log),您注册一个事件侦听器将触发console.log()功能,因为它的回调。响应对象是事件发送器,当您的请求从远程服务器接收到数据时,它会发出由侦听器拾取的事件'data'事件。该事件将收到的数据作为第一个参数隐式传递给监听器上的回调函数console.log。对于'错误'事件,同样的过程也适用。

0

您的解决方案可以改写成这样:

function logData (data) { 
    console.log(data); 
} 

res.on('data', logData); 

由于您logData函数什么都不做,但数据传递给console.log,你可以因此简单地直接传递console.log作为参数:

res.on('data', console.log); 

请注意,它不是传递数据的匿名函数的语法:

res.on('data', function (data) {}); // <-- `data` is not passed 
            //  due to this syntax 

相反,参数通过,因为res.on将数据作为第一个参数传递给传递给它的函数。从data事件从stream.Readable文档(这是由http.incomingMessage继承这就是res以上):

事件:“数据”

- chunk [Buffer|String] The chunk of data. 

如果将数据事件监听器,那么它会将流切换为流动模式,并且>数据将在可用时立即传递给您的处理程序。

chunk部分指定它是传递给传递给data事件处理函数的参数。


注意console.log不一定的方式,将允许你这样做在其他JavaScript解释器来实现。例如,在Chrome和Firefox中,.log()方法在内部依赖于this,所以如果您只是简单地通过它,它就会失败。相反,你需要将其绑定到console

res.on('data', console.log.bind(console)); 

或者在解决方案中使用的包装功能类似的更传统的方式。恰巧Node.js没有这个问题。但是Node并不是唯一的服务器端JavaScript实现。因此,将代码移植到其他解释器(如VertX)时要小心。