Nodejs监听来自http.get()的数据事件的响应stream

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

在http客户端和HTTP收集部分我有一个问题。 尽pipe我已经阅读了他们和node.js上的API文档。 第一个挑战是, “将响应中每个”数据“事件的string内容写入控制台(stdout)中的新行。” 它在https收集部分说,“从服务器收集所有数据(不只是第一个”数据“事件)…”并引用第一个,因为它不收集所有数据。 不是

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

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

就目前为止我已经理解的asynchronous性质,下面的第一个callback将被称为asynchronoushttp.get()完成时。 或者我错了http.get()不是asynchronous的。

 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); }) 

这段代码执行时会发生什么? callback是否等待http.get()完成并提供response ,所以http.get()是asynchronous的? 如果是这样,当事件被触发时, response.on(..)行正在侦听,创build后。

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

一个解释可以是这样的; http.get()做什么来创build一个响应对象到服务器上写入并完成。 因此,它通过创build响应对象来完成它的工作,从现在开始,服务器可能会开始写入这个响应stream,并且callback已经开始,监听服务器写入任何位数据时触发“数据”事件的响应stream到它。 这在逻辑上是可能的。

这是node.js的一个常见function的例子,称为stream。

Http.get在调用callback之前完成执行(通过创buildstream)。 这是在callback中仍在处理的stream。 http.get的最终结果是在收到完整响应之前仍在更新的stream对象。

考虑callback的方法不是在父执行完成时执行的函数,而是作为另一个函数的参数的函数。 从理论上来说,在执行周期内没有任何事情可以阻止父执行callback。 在node.js中的约定恰好是在父对象完成后执行的。

你正确的说,函数callback是作为parameter passing给函数http.get ,所以它可以访问在执行http.get创build的响应对象。 然而,还有一件事是响应是一个stream,意味着它不断更新,直到完成。

这是操作的顺序

  1. http.get调用外部资源。
  2. http.get以stream的http.get创build响应对象,并在数据从外部资源进入时更新它
  3. 响应对象每次更新时,都会发出一个“数据”事件。
  4. 函数callback包含一个监听器(response.on),在抛出“data”事件时激活。

下面是一个创buildstream并将其传递给callback函数的示例

 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);