“杂耍asynchronous” – 为什么我的解决scheme不会返回任何东西?

在问了一个问题,并得到一个非常有用的答案,在learnyounode的“Async Juggling”任务要求我做什么的时候,我着手自己实现它。

问题是,我的设置没有任何成功! 尽pipe我已经提到了其他的解决scheme,但是当我执行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); 

问题:我做错了什么?

这条线

  for(var iterator in urls) { 

不做你认为的事情。 它实际上遍历了urls的属性(请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for…in )。 相反,你必须做类似的事情

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

要么

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

除了没有正确循环app模块内的数组之外,我还没有正确连接从response.on('data')事件返回response.on('data') 。 本来我在做…

 responses[index] += data; 

相反,正确的做法是:

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

改变这一点,以及由@arghbleargh注意到的事情得到了“asynchronous杂耍”充分validation!

我testing了我的代码,它一切工作:

 ~ $ 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('\n@@@@@@@@@@@@ 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); }