繁体   English   中英

Node.js侦听来自http.get()的数据事件的响应流

[英]Nodejs Listening to response stream on data event from http.get()

我正在研究Node.js。 为此,我正在使用有用的nodeschool.io研讨会。 我正在阅读learningyounode研讨会。

在http客户端和http收集部件中,我遇到了问题。 尽管我已经阅读了它们以及node.js上的api文档。 第一个挑战是; “将响应中的每个“数据”事件的字符串内容写入控制台上的新行(stdout)。 它在https收集部分中说:“从服务器收集所有数据(而不仅仅是第一个“数据”事件)...”,并引用第一个,因为它不收集所有数据。 是不是

var allData = "";
response.setEncoding('utf8');
response.on('data', function(data){
    allData = concat(allData, data);
}

能够从响应中收集所有数据。

据到目前为止我所了解的异步性质,异步http.get()完成时将调用以下第一个回调。 或者我错了http.get()不是异步的。

var http = require('http');
var urlString = process.argv[2];
http.get(urlString, function callback (response) {
    response.setEncoding('utf8');
    response.on('data', console.log);
    response.on('error', console.error);
})

执行此代码时会发生什么。 回调是否会等待http.get()完成并提供response ,所以http.get()是异步的? 如果是这样,则在触发事件时,将在创建它之后侦听response.on(..)行。

这不是侦听在创建response执行的连续过程,在这种情况下, callback不应等待http.get()完成执行,以便事件侦听器可用于response对象触发的事件?

可以这样解释: http.get()为创建响应对象以进行服务器写操作并完成操作。 因此,它通过创建响应对象完成了工作,从现在开始,服务器可能会开始写入此响应流,并且回调已经进行,继续侦听响应流中服务器写入任何数据时触发的“数据”事件对此。 在逻辑上这是可能的。

这是称为流的node.js共同特征的示例。

Http.get在调用回调之前完成执行(通过创建流)。 流仍在回调中处理。 http.get的最终结果是流对象,该对象仍在更新,直到收到完整的响应。

考虑回调的方式不是作为父级执行完毕后执行的函数,而是作为另一个函数的参数的函数。 从理论上讲,没有什么可以阻止父级在其执行周期中的任何时间执行回调。 node.js中的约定恰好是在父对象完成之后执行回调。

您是正确的,将函数回调作为参数传递给函数http.get ,因此它可以访问在执行http.get期间创建的响应对象。 但是,也正在发生的是,响应是一个流,这意味着它会不断更新直到完成。

这是操作顺序

  1. http.get调用外部资源。
  2. http.get将响应对象创建为流,并在数据来自外部资源时对其进行更新
  3. 每次更新响应对象时,它都会发出一个“数据”事件。
  4. 函数回调包含一个侦听器(response.on),只要抛出“数据”事件,该侦听器就会被激活。

这是创建流并将其传递给回调的函数的示例

function myAsyncFunction(callback){
    var result = createStream();  // perform processing to create a streaming object

    // at this point, the parent function is done so lets execute the callback

    callback(result);
}

function processStream(example){
    example.on('data', function(chunk){
        console.log('chunk received' + chunk);
    });

    example.on('end', function(){
        console.log('streaming is complete');
    });
}

myAsyncFunction(processStream);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM