节点流:不传递回调函数值

时间:2014-10-07 16:40:35

标签: javascript node.js callback

我正在使用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如何使用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 个答案:

答案 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)时要小心。