我正在使用nodeschool.io' learnyounode http client exercise。
这是任务:
编写一个程序,对提供给的URL执行HTTP GET请求 你作为第一个命令行参数。写出String的内容 每个"数据"响应控制台上的新行的事件 (标准输出)。
我的解决方案是:
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如何使用data
或error
对象。它们似乎没有传递给回调函数。
var http = require('http')
http.get(process.argv[2], function (response) {
response.setEncoding('utf8')
response.on('data', console.log)
response.on('error', console.error)
})
答案 0 :(得分:0)
使用response.on('data', console.log)
,您正在注册一个事件监听器,它将触发console.log()
函数作为回调函数。响应对象是一个事件发射器,当您的http.get
请求从远程服务器接收数据时,它会发出由侦听器拾取的'数据'事件。该事件隐式地将接收到的数据作为第一个参数传递给侦听器上的console.log
回调函数。同样的过程适用于'错误'事件。
答案 1 :(得分: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
的{{1}}事件的文档(由http.incomingMessage继承,这是stream.Readable
上面的内容):
事件:'数据'
res
如果您附加了数据事件监听器,那么它会将流切换为流动模式,并且&gt;数据一旦可用就会传递给您的处理程序。
- chunk [Buffer|String] The chunk of data.
部分指定它是传递给传递给chunk
事件处理程序的函数的参数。
请注意,data
不一定以允许您在其他JavaScript解释器中执行此操作的方式实现。例如,在Chrome和Firefox中,console.log
方法在内部依赖于.log()
,因此如果您只是简单地传递它就会失败。相反,您需要将其绑定到this
:
console
或者在解决方案中使用包装函数的更传统方式。只是发生Node.js没有这个问题。但Node并不是唯一的服务器端javascript实现。因此在将代码移植到其他解释器(例如VertX)时要小心。