【问题标题】:LearnYouNode: Juggling Async without BL/Async/AfterLearnYouNode:在没有 BL/Async/After 的情况下杂耍异步
【发布时间】:2020-05-31 23:02:01
【问题描述】:

当出现第 9 步时,我正在学习本教程。

这个问题和上一个问题(HTTP COLLECT)一样,需要使用http.get()。但是,这一次将为您提供三个 URL 作为前三个命令行参数。

您必须收集每个 URL 提供给您的完整内容并将其打印到控制台 (stdout)。您不需要打印出长度,只需将数据打印为字符串即可;每个 URL 一行。问题是您必须按照作为命令行参数提供给您的 URL 的顺序打印它们。

我的代码是(它不能在他喜欢的时候正常工作):

http = require("http");
var url = [process.argv[2], process.argv[3], process.argv[4]];
var responses = [];
var completed_responses = 0;

for(var i in url){
    http.get(url[i], function(response){
        var content = "";
        //if(completed_responses == url.length){
                response.setEncoding("utf-8");
                response.on("data", function(data){
                    content += data;
                })
                response.on("error", console.error);
                response.on("end", function(end){
                    console.log(content);
                });
        
    })
}

答案是:

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

没有 BL/AFTER/ETC 的正确答案是什么?

谢谢大家!

【问题讨论】:

  • 什么是 BL/Async/After/BL/AFTER/ETC?
  • @Bergi Node.JS 第三方库。示例:BufferList 编辑:用于同步异步事物。

标签: javascript node.js http asynchronous get


【解决方案1】:

当我第一次学习节点时,我自己完成了那个教程,我记得教程的那个步骤。解决方案相当令人失望。无论如何,为了你的答案:

NodeJs Asynchronous programming - Coordinating parallel calls

您可以检查问题中的代码并进行我在回答中建议的修复。这应该可以在没有 BL/Async/任何其他教程提到的情况下解决它。

【讨论】:

    【解决方案2】:

    这是我的 Juggling Async 挑战代码,不使用任何第三方库。

    var http = require("http");
    var urls = [process.argv[2], process.argv[3], process.argv[4]];
    
    var urlResults = new Array("", "", "");
    var allDoneCount = 0;
    
    urls.forEach(function (_url) {
    
        http.get(_url, function (resp) {
            resp.on("data", function (data) {
                if (_url === urls[0]) {
                    urlResults[0] += data.toString();
                } else if (_url === urls[1]) {
                    urlResults[1] += data.toString();
                } else {
                    urlResults[2] += data.toString();
                }
            })
    
            resp.on("end", function () {
                allDoneCount++;
                if (allDoneCount === 3) {
                    console.log(urlResults[0]);
                    console.log(urlResults[1]);
                    console.log(urlResults[2]);
                }
            })
    
            resp.on("error", function (err) {
                console.log(err);
            })
    
        }).on("error", function (err) {
            console.log(err);
        })
    })
    

    【讨论】:

      【解决方案3】:

      这就是无需任何外部模块(http ;P 除外)即可实现的方法。

      const http = require('http'); //http module
      
      let results = ["", "", ""]; //this will store the data from http.get()
      let counter = 0; //to keep a counter for no of httpget's done
      
      //it will iterate when counter is 3 i.e. the 'end' for all
      function print() {
        for (let i = 0; i < 3; i++) {
          console.log(results[i]);
        }
      }
      
      //accept index(for process.argv) as parameter
      function httpGetter(i) {
        //http.get method on the url first encountered, 2+i because 2 values are reserved
        http.get(process.argv[2 + i], (res) => {
          //for converting (res)ponse to string/alternatively toString() method can be used
          res.setEncoding('utf8');
          //event data on the url, callback with recived chunk as parameter
          res.on('data', function(chunk) {
            //appending the recived chunk to that element of results corresponding to 'i' of httpGetter function
            results[i] += chunk;
          });
          //event end, when no more data is read
          //runs every time for each value of 'i' that is for each url
          res.on('end', function() {
            //to keep count
            counter++;
            //when 3 that is when data from all inputs receved
            if (counter === 3) {
              //print function simply iterating over results array
              print();
            }
          });
        })
      }
      
      
      //inputs are recieved from here
      for (let i = 0; i < 3; i++) {
        //i can be index for results
        httpGetter(i);
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2015-10-28
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多