分配给序列数组的异步结果



我正在做LearnYouNode的练习9。练习的目标是按照命令行上给出的参数的顺序打印HTTP结果的内容。一切似乎都在正常工作,但它们并没有保持秩序。我意识到在回调中包含jobId是错误的,因为它在完成之前不会执行,但我仍然完全不知道如何使它按预期运行。仅供参考,我试图在不使用Async或任何其他库进行教育的情况下做到这一点。此外,任何基于我的编码的与我的问题无关的其他提示都将不胜感激!

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);
});
});

这样做的一种方法可以是:

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

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

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

最新更新