繁体   English   中英

Node.js“ LearnYouNode”杂耍异步功能不起作用

[英]Node.js “LearnYouNode” juggling async function not working

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

我正在LearnLearnNode中解决此杂耍异步问题,但我不知道为什么我的代码无法正常工作。

我的代码:

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

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

编辑:问题是“ strs [i] + =数据”部分不起作用!

  1. 实际:“”
  2. 预期:“十字架像草皮一样,有多雀斑的雀斑。你的小开膛手走了走动,交配着你的小开膛手k。”

  3. 实际:“”

  4. 预期:“当疯了似的,干得像牛奶棒一样。醒来像黏稠的喙,我的手拿来一点腊肠。他没有鹦鹉走私者,像秀场小马一样醒来。”

  5. 实际:“”

  6. 预期:“您要开挖的小开膛手小鸟。抓住我们的灌木丛牡蛎,您会把小开膛手dero堆起来。让一些苹果伴侣大吃一惊。”

  7. 实际:“”

  8. 预期:“”

当http.get运行时,“ i”的值在“ for”循环中为2,因为它是“ i”在循环中的最后一个值。 取而代之的是函数中的值是正确的'0''1'和'2',因为在函数中传递'i'时您在函数中具有局部变量。

它与关闭有关: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

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

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

输出始终为3 ,因为for循环在调用完成async方法之前完成。

但是,您可以在es6中使用let关键字来保留被阻止的作用域变量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM