“杂耍异步” - 为什么我的解决方案根本不返回任何内容

'Juggling Async' - Why does my solution not return anything at all?

本文关键字:解决方案 返回 任何内 我的 为什么 异步 杂耍异步      更新时间:2023-09-26

在提出一个问题并得到一个非常有用的答案后,learnyounode中的"异步杂耍"作业要求我做什么,我开始自己实现它。

问题是,我的设置没有任何成功! 即使我已经参考了其他解决方案,当我执行learnyounode verify myscript.js时,我的设置根本没有返回任何结果。

GIST:杂耍异步.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')事件返回data。 本来我在做...

responses[index] += data;

相反,正确的做法是:

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

改变这一点,以及@arghbleargh注意到的事情,得到了"异步杂耍"的充分验证!

我已经测试了我的代码,它都有效:

~ $ 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);
}
相关文章: