Node.js" LearnYouNode"杂乱的异步功能不起作用

时间:2017-07-30 15:58:19

标签: javascript node.js

我是javascript和node.js的新手,所以这可能是基本的javascript问题..

我在LearnYouNode中解决了这个杂耍异步问题,但我不知道为什么我的代码不起作用。

我的代码:

const http = require('http');

var URLs = [process.argv[2], process.argv[3], process.argv[4]];
var strs = ["", "", ""];
var ctr = 0;

for(var i = 0; i < 3; i++){
    http.get(URLs[i], (response) => {
        response.setEncoding('utf8');
        response.on('data', (data) => {
            strs[i] += data;
        });
        response.on('end', () => {
            ctr++;
            if(ctr == 3){
                console.log(strs[0]);
                console.log(strs[1]);
                console.log(strs[2]);
            }
        });
    });
}

我的代码不起作用,但此代码确实:

const http = require('http');

var URLs = [process.argv[2], process.argv[3], process.argv[4]];
var strs = ["", "", ""];
var ctr = 0;

function httpGet(i){
    http.get(URLs[i], (response) => {
        response.setEncoding('utf8');
        response.on('data', (data) => {
            strs[i] += data;
        });
        response.on('end', () => {
            ctr++;
            if(ctr == 3){
                console.log(strs[0]);
                console.log(strs[1]);
                console.log(strs[2]);
            }
        });
    });
}

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

代码只能通过将其作为一个函数来工作。为什么是这样?

编辑: 问题是&#34; strs [i] + = data&#34;部分不起作用!

  1. ACTUAL:&#34;&#34;
  2. 预期:&#34;像鲤鱼一样交叉,有多么痘痘。你的小开膛手走了,你的小开膛手khe sanh。 &#34;

  3. ACTUAL:&#34;&#34;

  4. 预期:&#34;当像野蛮人一样疯狂时,像牛奶一样干。像一个粘糊糊的东西突然出现,让我得到一些larrikin。他没有一个乞丐走私者,像一个表演小马一样脱颖而出。 &#34;

  5. ACTUAL:&#34;&#34;

  6. 预期:&#34;你们在我们挖掘机的地方开辟了小小的开膛手。抓住我们一个灌木牡蛎堆你小开膛手dero。让我们得到一些苹果伴侣的组合。 &#34;

  7. ACTUAL:&#34;&#34;

  8. 预期:&#34;&#34;

2 个答案:

答案 0 :(得分:0)

当http.get运行&#39;的值时我&#39;在循环中是2&#39;为了&#39;因为这是&#39; I&#39;已经循环。 而在功能上,价值是正确的&#39; 0&#39; &#39; 1&#39;和&#39; 2&#39;因为通过&#39;我&#39;在函数中,你在函数中有一个局部变量。

与闭包有关:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

答案 1 :(得分:0)

将异步方法包装在函数中的原因更好,因为传递的索引i与预期的索引相同。

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i)
    }, 1000);
}

输出始终为3,因为for循环在异步方法完成之前完成。

但是,您可以使用es6中的let关键字来保留阻止的范围变量。

for (let i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i)
    }, 1000);
}