异步结果分配给顺序数组

时间:2018-07-29 06:11:43

标签: node.js

我正在执行LearnYouNode的练习9。该练习的目的是按照命令行上给定的参数顺序打印HTTP结果的内容。一切似乎都工作正常,但并没有保持秩序。我意识到将jobId包含在回调中是错误的,因为在完成之前它不会执行,但是我仍然对如何使它按预期方式完全被阻止。仅供参考,我试图在不使用异步或任何其他图书馆进行教育的情况下执行此操作。此外,任何其他与我的问题无关的基于我的编码的技巧都将不胜感激!

const http = require('http');

urls = process.argv.slice(2, process.argv.length);

function multiGetter (urlList, callback) {
    var results = new Array(urlList.length);
    var current = 0;
    var completed = 0;
    var hasErrors = false;


    function done(err) {
        if(err) {
            hasErrors = true;
            return callback(err);
        }
        if(++completed === urlList.length && !hasErrors) {
            callback(null, results);
        }
    }

    urls.forEach( (url) => {
        http.get(url, (res) => {
            let jobId = current;
            current++;
            results[jobId] = '';
            res.setEncoding('utf8')
               .on('error', (e) => { console.error(e.message); })
               .on('data', (data) => { results[jobId] += data; })
               .on('end', () => { done(null); });
        }).on('error', console.error);
    });
}

multiGetter(urls, (err, contents) => {
    if (err) {
        console.error;
    }
    contents.forEach(result => {
        console.log(result);
    });
});

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法可能是:

  • results变量更改为对象而不是数组:var results = {};
  • jobId分配url而不是current的值(您可以摆脱current变量)

最后,在底部的回调中,将迭代更改为:

urls.forEach(url => {
    console.log(contents[url]);
});