(9)玩轉(zhuǎn)異步

2018-02-24 16:05 更新

要求

這次的問題和之前的問題(HTTP 收集器)很像,也是需要使用到 http.get() 方法。然而,這一次,將有三個(gè) URL 作為前三個(gè)命令行參數(shù)提供。

需要收集每一個(gè) URL 所返回的完整內(nèi)容,然后將它們在終端(標(biāo)準(zhǔn)輸出stdout)打印出來。這次不需要打印出這些內(nèi)容的長度,僅僅是內(nèi)容本身即可(字符串形式);每個(gè) URL對應(yīng)的內(nèi)容為一行。重點(diǎn)是必須按照這些 URL 在參數(shù)列表中的順序?qū)⑾鄳?yīng)的內(nèi)容排列打印出來才算完成。

提示

不要期待這三臺(tái)服務(wù)器能好好的一起玩耍!他們可能不會(huì)把完整的響應(yīng)的結(jié)果按照希望的順序返回,所以不能天真地只是在收到響應(yīng)后直接打印出來,因?yàn)檫@樣做的話,他們的順序可能會(huì)亂掉。

需要去跟蹤到底有多少 URL 完整地返回了他們的內(nèi)容,然后用一個(gè)隊(duì)列存儲(chǔ)起來。一旦擁有了所有的結(jié)果,才可以把它們打印到終端。

對回調(diào)進(jìn)行計(jì)數(shù)是處理 Node 中的異步的基礎(chǔ)。比起自己去做,去依賴一個(gè)第三方的模塊或者庫會(huì)更方便,比如?async?或者?after。不過,在本次練習(xí)中,應(yīng)該首先嘗試自己去解決,而不是依賴外部的模塊。

代碼

  • 方法一
var http = require('http');
var result = ['','',''];
var isEnd = [false, false, false];

   http.get(process.argv[2], function(res){
       res.setEncoding('utf8');
       res.on('data', function(data){
           result[0] += data;
       });
       res.on('end', function(data){
           isEnd[0] = true;
           if(isEnd[0]&&isEnd[1]&&isEnd[2]){
               console.log(result[0]);
               console.log(result[1]);
               console.log(result[2]);
           }
       });
   });
   http.get(process.argv[3], function(res){
       res.setEncoding('utf8');
       res.on('data', function(data){
           result[1] += data;
       });
       res.on('end', function(data){
           isEnd[1] = true;
           if(isEnd[0]&&isEnd[1]&&isEnd[2]){
               console.log(result[0]);
               console.log(result[1]);
               console.log(result[2]);
           }
       });
   });
   http.get(process.argv[4], function(res){
       res.setEncoding('utf8');
       res.on('data', function(data){
           result[2] += data;
       });
       res.on('end', function(data){
           isEnd[2] = true;
           if(isEnd[0]&&isEnd[1]&&isEnd[2]){
               console.log(result[0]);
               console.log(result[1]);
               console.log(result[2]);
           }
       });
   });
  • 方法二
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)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號