Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js流管道异步或同步_Javascript_Node.js - Fatal编程技术网

Javascript node.js流管道异步或同步

Javascript node.js流管道异步或同步,javascript,node.js,Javascript,Node.js,问题:这是node.js的LearnyYouNode模块JugglingAsync中的问题。 “此问题与上一个问题(HTTP COLLECT)相同,因为您需要使用HTTP.get()。但是,这次将为您提供三个URL作为前三个命令行参数 您必须收集每个URL提供给您的完整内容,并将其打印到控制台(stdout)。您不需要打印长度,只需要将数据作为字符串打印出来;每个URL一行。关键是,您必须按照URL作为命令提供给您的相同顺序打印出来 行参数。” 我尝试使用node.js stream.reada

问题:这是node.js的LearnyYouNode模块JugglingAsync中的问题。 “此问题与上一个问题(HTTP COLLECT)相同,因为您需要使用HTTP.get()。但是,这次将为您提供三个URL作为前三个命令行参数

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

我尝试使用node.js stream.readable类将响应从第一个URL传递到第二个URL,并将响应从第一个URL传递到第三个URL。我希望这将同步运行,即当第一个请求完成时,第二个请求将通过管道传输。我使用包bl()收集get请求的所有响应数据。 下面的代码片段:

var https = require('http');
var bl = require('bl');
var finalString = '';

https.get( process.argv[2], function(response)
    {
        response.setEncoding('utf8');
        response.pipe(bl(function (err, data)
        {
            console.log("First request called");
            if (err) return console.error(err);
            console.log(data.toString());

        })).pipe(bl(function(err, data)
        {

            console.log("Second Request called");
            https.get (process.argv[3], function( response)
            {
                response.setEncoding('utf8');
                response.pipe(bl( function (err, data)
                {
                    if (err) return console.error(err);                    
                    console.log(data.toString());

                }))
            }).on('error', function(err)
                {
                    console.log(err);
                })
        })).pipe( bl(function(err,data)
            {
                console.log("Third request called");
                https.get (process.argv[4], function( response)
                {

                    response.setEncoding('utf8');
                    response.pipe(bl( function (err, data)
                    {
                        if (err) return console.error(err);                        
                        console.log(data.toString());

                    }))

                }).on('error', function(err)
                    {
                        console.log(err);
                    })
            })
            )
    }).on('error', function (err)
    {
            console.log(err);
    }
);

输出不遵循请求的顺序。我做错了什么?

据我所知,{innodejs}流中的
pipe
是异步的,但我在某个地方读到过,它们也可以作为同步的。上面的解决方案以异步方式运行,因此以随机顺序打印数据

您的解决方案可以通过以下方式实现:-

var https = require('http');
var bl = require('bl');
var finalData = [];
var count = 0;

https.get( process.argv[2], function(response)
    {
        response.setEncoding('utf8');
        response.pipe(bl(function (err, data)
        {
            // console.log("First request called");
            if (err) return console.error(err);
            finalData[0] = data.toString();
            count++;
            printThemOut(count);

        })).pipe(bl(function(err, data)
        {

            // console.log("Second Request called");
            https.get (process.argv[3], function( response)
            {
                response.setEncoding('utf8');
                response.pipe(bl( function (err, data)
                {
                    if (err) return console.error(err);
                    finalData[1] = data.toString();
                    count++;
                    printThemOut(count);

                }))
            }).on('error', function(err)
                {
                    console.log(err);
                })
        })).pipe( bl(function(err,data)
            {
                // console.log("Third request called");
                https.get (process.argv[4], function( response)
                {

                    response.setEncoding('utf8');
                    response.pipe(bl( function (err, data)
                    {
                        if (err) return console.error(err);
                        finalData[2] = data.toString();
                        count++;
                        printThemOut(count);
                    }))

                }).on('error', function(err)
                    {
                        console.log(err);
                    })
            })
            )
    }).on('error', function (err)
    {
            console.log(err);
    }



);

function printThemOut(count) {
  if (count == 3) {
    for (var i = 0; i < finalData.length; i++) {
      console.log(finalData[i]);
    }
  }
}
var http  = require("http");
var bl    = require("bl");

var completeData = [];
var count = 0;
for (var i = 2; i < process.argv.length; i++) {
  (function(index){
    http.get(process.argv[index], function(res) {
      res.pipe(bl(function(err, data) {
        if (err) {
          return console.log(err);
        }
        // console.log(index);
        completeData[index-2] = data.toString();
        count++;
        // console.log("Data: " + data.toString());
        if (count === process.argv.length-2) {
          printThemOut(completeData);
        }
      }))
    })
  })(i);
}

function printThemOut(data) {
  for (var i = 0; i < data.length; i++) {
    console.log(data[i]);
  }
}