2014-11-13 2 views
1

learnyounode의 '비동기 저글링'과제에 대해 질문하고 매우 유용한 답변을 얻은 후에 필자는 직접 구현하려고했습니다.'Juggling Async'- 내 솔루션이 전혀 반환하지 않는 이유는 무엇입니까?

문제는 설정에 아무런 문제가 없다는 것입니다. 밖에있는 다른 솔루션을 언급 했음에도 불구하고 learnyounode verify myscript.js을 수행하면 설치 프로그램이 결과를 반환하지 않습니다.

GIST: jugglingAsync.js

var http = require('http'); 

var app = (function() { 
    // Private variables... 
    var responsesRemaining, 
     urls = [], 
     responses = []; 

    var displayResponses = function() { 
     for(var iterator in responses) { 
      console.log(responses[iterator]); 
     } 
    }; 

    // Public scope... 
    var pub = {}; 

    pub.main = function (args) { 
     responsesRemaining = args.length - 2; 

     // For every argument, push a URL and prep a response. 
     for(var i = 2; i < args.length; i++) { 
      urls.push(args[i]); 
      responses.push(''); 
     } 

     // For every URL, set off an async request. 
     for(var iterator in urls) { 
      var i = iterator; 
      var url = urls[i]; 

      http.get(url, function(response) { 
       response.setEncoding('utf8'); 

       response.on('data', function(data) { 
        if(response.headers.host == url) 
         responses[i] += data; 
       }); 

       response.on('end', function() { 
        if(--responsesRemaining == 0) 
         displayResponses(); 
       }); 
      }); 
     } 
    }; 

    return pub; 
})(); 

app.main(process.argv); 

질문 : 내가 잘못 뭐하는 거지?

+2

게시물에 관련 코드를 입력하십시오. 어떤 사람들은 외부 링크를 열 수 없거나 열지 않을 것입니다. 게다가 외부 링크는 결국 내려 가서이 질문을 다른 사람들에게 쓸모 없게 만듭니다. –

+0

@ IngoBürk 요청 당 제공된 코드. 왜 이것이 좋은 생각인지 상기시켜 주셔서 감사합니다. –

답변

2

이 줄

for(var iterator in urls) { 

은 당신이하지 생각하지 않습니다. 실제로는 urls의 속성을 반복합니다 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in 참조). 대신, 당신은 또한 제대로 dataresponse.on('data') 이벤트에서 반환 합치되지 않은, 또한

for(var i = 0; i < urls.length; i++) { 
     var url = urls[i]; 
     ... 
    } 

또는

urls.forEach(function(url, index) { 
     ... 
    }); 
+0

대신 (for iterator in collection) {} 루프를'collection.forEach (function (item [, index]) {}) '로 변경했습니다. 내 설정은 여전히 ​​작동하지 않지만 자바 스크립트의'for (object in prop) '연산자가 어떻게 작동하는지 이해하는 데 도움을 주셔서 감사합니다. –

0

제대로 app 모듈 내부의 배열을 통해 반복하지하는 같은 것을해야한다. 원래 내가 대신 ...

responses[index] += data; 

을하고 있었는데, 할 수있는 올바른 것은이었다

responses[index] = responses[index] + data; 

가지고 @arghbleargh에 의해 나타나는 저장뿐만 아니라 일 변경 '비동기 저글링'완벽 검증!

0

내 코드를 테스트 한 모든 일 :

~ $ node juggling_async.js site1 site2 site3 site4 ... 

JS 코드는 세 가지 사이트를 제한하지 않습니다.

var http = require('http'); 

// Process all the site-names from the arguments and store them in sites[]. 
// This way does not limit the count to only 3 sites. 
var sites = []; 
(function loadSites() { 
    for(var i = 2, len = process.argv.length; i < len; ++i) { 
     var site = process.argv[i]; 
     if(site.substr(0, 6) != 'http://') site = 'http://' + site; 
     sites.push(site); 
    } 
})(); 

var home_pages = []; 
var count = 0; 
function httpGet(index) { 
    var home_page = ''; 
    var site = sites[index]; 
    http.get(site, function(res) { 
     res.setEncoding('utf8'); 
     res.on('data', function(data) { 
      home_page += data; 
     }); 
     res.on('end', function() { 
      ++count; 
      home_pages[index] = home_page; 
      if(count == sites.length) { 
       // Yahoo! We have reached the last one. 
       for(var i = 0; i < sites.length; ++i) { 
        console.log('\[email protected]@@@@@@@@@@@ Site #' + (+i+1) + ': ' + sites[i]); 
        console.log(home_pages[i]); 
        console.log('============================================\n'); 
       } 
      } 
     }); 
    }) 
    .on('error', function(e) { 
     console.log('Error at loop index ' + inddex + ': ' + e.message); 
    }) 
    ; 
} 
for(var i = 0; i < sites.length; ++i) { 
    httpGet(i); 
} 
관련 문제