NodeJS http.get()async和回调函数

时间:2016-05-04 17:24:18

标签: javascript node.js asynchronous http-get

我正在研究" learnyounode"练习9,Juggling Async。问题是:

  

此问题与上一个问题(HTTP COLLECT)相同   你需要使用http.get()。但是,这次你会   提供了三个URL作为前三个命令行参数       您必须收集每个URL提供给您的完整内容,并将其打印到控制台(stdout)。你不需要打印   超出长度,只将数据作为字符串;每个网址一行。抓住了   是你必须按照与URL相同的顺序打印出来   作为命令行参数提供给你。

我有两种不同的解决方案,大致相同。唯一的区别是工作的是模块化的而另一个不是(并且不起作用)。我无法理解差异和原因。这是我的代码:

工作解决方案:

const http = require('http');
const bl = require('bl');

var msgs = [];
var complete = 0;

function printAll() {
    for (var i = 0; i < 3; i++) {
        console.log(msgs[i]);
    }
}

function doGet(i) {
    http.get(process.argv[i + 2], function(res) {
        res.pipe(bl(function(err, data) {
            if (err) {
                return console.error(err);
            }
            complete++;
            msgs[i] = data.toString();
            if (complete == 3) {
                printAll();
            }
        }));
    });
}

for (var i = 0; i < 3; i++) {
    doGet(i);
}

错误的解决方案singleFunction.js

const http = require('http');
const bl = require('bl');

var msgs = [];
var complete = 0;

for (var i = 0; i < 3; i++) {
    http.get(process.argv[i + 2], function(res) {
        res.pipe(bl(function(err, data) {
            if (err) {
                return console.error(err);
            }
            complete++;
            msgs[i] = data.toString();
            if (complete == 3) {
                for (var j = 0; j < 3; j++) {
                    console.log(msgs[j]);
                }
            }
        }));
    });
}

learnyounode run singleFunction.js的输出:

undefined
undefined
undefined

我甚至不确定这里我不完全理解的是什么。是NodeJS事件循环,还是传递Javascript函数,NodeJS回调,甚至其他东西?谢谢你的帮助。

编辑: 最后找出原因并修复有用的评论。模块化解决方案起作用的原因是因为idoGet(i)的范围以及回调与for循环不同。因此索引值是正确的。在调用任何回调之前,主for循环将完成并将i增加到3路,从而在{1}处获得undefined

0 个答案:

没有答案