首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习节点#9杂耍异步

学习节点#9杂耍异步
EN

Stack Overflow用户
提问于 2015-04-06 03:37:16
回答 6查看 4.6K关注 0票数 5

我正试着通过节点学校的学习节点。

这个问题与前面的问题()相同,因为您需要使用http.get()。但是,这一次将为您提供三个URL作为前三个命令行参数。 您必须收集每个URL提供给您的完整内容,并将其打印到控制台(stdout)。您不需要打印长度,只需将数据打印为字符串;每个URL只需一行。问题是,您必须按照URL作为命令行参数提供给您的相同顺序打印出来。

我不明白为什么我的解决方案不能完全工作,因为在我看来,它看起来是一样的,但功能更强,并且不确定它们的内部测试工作:

代码语言:javascript
复制
1.  ACTUAL:    ""
1.  EXPECTED:  "As busy as a dead horse also lets get some dero. Built like a sleepout no dramas lets get some chook. She'll be right thingo my she'll be right ute. "

2.  ACTUAL:    "She'll be right bizzo no worries she'll be right fair dinkum. We're going aerial pingpong no worries as busy as a gyno. "
2.  EXPECTED:  "She'll be right bizzo no worries she'll be right fair dinkum. We're going aerial pingpong no worries as busy as a gyno. "

3.  ACTUAL:    "He's got a massive pretty spiffy heaps she'll be right brizzie. He hasn't got a fly wire where shazza got us some strewth. She'll be right spit the dummy with it'll be fair go. We're going gobsmacked with as stands out like arvo. He's got a massive bush bash mate she'll be right slacker. "
3.  EXPECTED:  "He's got a massive pretty spiffy heaps she'll be right brizzie. He hasn't got a fly wire where shazza got us some strewth. She'll be right spit the dummy with it'll be fair go. We're going gobsmacked with as stands out like arvo. He's got a massive bush bash mate she'll be right slacker. "

4.  ACTUAL:    ""
4.  EXPECTED:  ""

我的代码:

代码语言:javascript
复制
var http = require('http');
var bl = require('bl');

var result = [];
var urls = process.argv.slice(2);
urls.forEach(function(url, i) {
  http.get(url, function(response) {
    response.pipe(bl(function(err, data) {
      if (err) return console.error(err);
      result[i] = data.toString();
      if (i === urls.length - 1) {
        console.log(result.join('\n'));
      }
    }));
  });
});

正式解决办法:

代码语言:javascript
复制
var http = require('http')
var bl = require('bl')
var results = []
var count = 0

function printResults () {
  for (var i = 0; i < 3; i++)
    console.log(results[i])
}

function httpGet (index) {
  http.get(process.argv[2 + index], function (response) {
    response.pipe(bl(function (err, data) {
      if (err)
        return console.error(err)

      results[index] = data.toString()
      count++

      if (count == 3)
        printResults()
    }))
  })
}

for (var i = 0; i < 3; i++)
  httpGet(i)

基本上,第一个测试从未通过(尽管如果迭代数组中只有一个url (而不是3个),那么第一个测试就通过了,而不是其他的)。任何洞察力都会很好。我不知道该在哪里问这个问题,也许我只是错过了一些JS的东西,如果这不合适的话,我很抱歉。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-04-06 04:27:44

您还没有确保下载了所有的urls。

请求不一定会按顺序返回。考虑一下,如果3是第一次回来。您将跳过另外两个urls,只打印出3个。

演示代码对响应的数量进行计数,因此在输出答案之前,可以保证获取所有内容。

票数 5
EN

Stack Overflow用户

发布于 2017-10-26 04:07:28

我认为您只需要等待直到所有要求的结果结束或任何一个错误。这是我过去的答案:

代码语言:javascript
复制
var http = require('http');
var bl = require('bl');

var urls = process.argv.slice(2)
var count = urls.length;

var results = [];

urls.forEach((url, index) => {
    http.get(url, (res) => {
        res.pipe(bl((err, data) => {
            if (err) throw err;

            results[index] = data.toString();
            count--;

            if (count == 0) {
                results.forEach((result) => {
                    console.log(result)
                });
            }
        }))
    })
})
票数 2
EN

Stack Overflow用户

发布于 2016-10-13 05:12:13

代码语言:javascript
复制
var http = require('http');

var links = [2, 3, 4];

var buffer = [];

(function render(index) {

http.get(process.argv[links[index]], function (response){

    response.setEncoding('utf8');

    response.on('data', function(chunk){
        if(buffer[index] === undefined) {
            buffer[index] = '';
        }
        buffer[index] += chunk;
    });
    response.on('end', function () {
        var newIndex = index+1;
        if(links[newIndex] !== undefined) {
            render(newIndex);
        } else {
            return renderOutput();
        }
    });
    response.on('error', console.error);

}).on('error', console.error);
})(0); //self-calling function

function renderOutput() {

buffer.forEach(function (elem) {

console.log(elem);

});
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29464995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档