处理多个调用异步回调

Ra1*_*den 3 javascript asynchronous node.js

我正在学习用Node.js的learnyounode.我遇到了问题JUGGLING ASYNC.问题描述如下:
作为命令行参数,您将获得三个URL.您应该http.get()调用从这些URL获取数据,然后按照与参数列表中的顺序相同的顺序打印它们.这是我的代码:

var http = require('http')
var truecount = 0;
var printlist = []
for(var i = 2; i < process.argv.length; i++) {
    http.get(process.argv[i], function(response) {
    var printdata = "";
    response.setEncoding('utf8');
    response.on('data', function(data) {
        printdata += data;
    })
    response.on('end', function() {
        truecount += 1
        printlist.push(printdata)
            if(truecount == 3) {
            printlist.forEach(function(item) {
                console.log(item)
            })
            }
    })
    })
}
Run Code Online (Sandbox Code Playgroud)

这是我不明白的问题:我正在尝试response.on('end', function(){})使用字典将完成的数据存储到每个URL中.但是,我不知道如何得到这个网址http.get().如果我可以在里面做一个局部变量http.get(),那就太好了但我想每当我声明一个变量时var url,它总是指向最后一个url.因为它是全局的并且它通过循环不断更新.我将这些已完成数据存储为密钥等于url的值的最佳方法是什么?

Law*_*nes 12

这就是我要解决问题的方法.

#!/usr/bin/env node

var http = require('http');
var argv = process.argv.splice(2),
    truecount = argv.length,
    pages = [];

function printUrls() {
  if (--truecount > 0)
    return;
  for (i = 0; i < pages.length; i++) {
    console.log(pages[i].data + '\n\n');
  }
}

function HTMLPage(url) {
  var _page = this;
  _page.data = '### [URL](' + url + ')\n';
  http.get(url, function(res) {
    res.setEncoding('utf8');
    res.on('data', function(data) {
      _page.data += data;
    });
    res.on('end', printUrls);
  });
}


for (var i = 0; i < argv.length; i++)
  pages.push(new HTMLPage(argv[i]));
Run Code Online (Sandbox Code Playgroud)

它在每个请求开始时将请求添加到数组中,这样一旦完成,我可以很好地通过响应迭代,知道它们的顺序正确.

在处理异步处理时,我发现将每个进程视为具体的开始和结束更容易.如果您需要保留请求的顺序,则必须在创建每个进程时进行输入,然后在完成时返回该记录.只有这样才能保证你的东西顺序正确.

如果你不顾一切地使用上面的方法,那么你可以在你的get回调闭包中定义一个变量并使用它来存储url,这样你就不会最后一个url覆盖你的变量了.但是,如果你这样做,当你必须使用process.argv中的url来按顺序访问每个响应时,你将大大增加你的开销.我不建议.