learnyounode – asynchronous杂耍 – http.get()的重复结果

在learnyounode上做一个教程,我遇到了以下问题。 从描述:

您将获得三个URL作为前三个命令行参数。 您必须收集每个URL提供给您的完整内容并将其打印到控制台(stdout)。 您不需要打印出长度,只需将数据打印为string; 每个URL一行。 问题在于,你必须按照与作为命令行参数提供给你的URL相同的顺序打印出来。

似乎有些时候,我得到了一个提供的url的重复结果,但是在其他时候,代码通过了本教程的作者创build的testing。

http = require('http') var urls = process.argv.slice(2) var output = [] // allocate space for the contents of each response. output.length = urls.length var counter = 0 urls.forEach( function(url, index, array) { http.get(url, function (response) { stream = '' response.on("error", function (error) { console.error('There was an error:', err) }) response.on("data", function (data) { stream = stream + data.toString(); }) response.on("end", function () { // it seems that this even fires multiple times for the same url (?) output.splice(index, 1, stream); counter += 1; if (counter == array.length) { output.forEach( function (element, index, array) { console.log(element); }) } }) }) }) 

由于无法用var初始化stream ,你已经把它变成了一个全局variables。 这意味着每个请求都试图初始化为'' ,然后在同一个variables中累加数据。 根据响应返回的顺序和事件被触发,你会得到各种废话作为输出。