javascript - Node.js 中的异步 http.get 调用(Learyounode 练习)

标签 javascript node.js asynchronous

我正在通过做 learnyounode exercises from nodeschool 来学习 Node 。 在第八个练习中,他们要求编写一个执行以下操作的程序:

  • 采用三个 URL 作为参数,
  • 从响应中收集数据,
  • 按照与参数中相同的顺序将它们打印到控制台。

他们简短地提到了异步库的存在,这有助于计算回调,但他们也邀请在没有它​​们的情况下完成练习。我最初的解决方案如下:

var http = require('http'); 
var bl = require('bl'); 
var results = Array();
var count = 0;

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


for (var index = 0; index < 3; index++)
    http.get(process.argv[2+index], function(response) {
        response.pipe(bl(function(err,data){
            if(err) console.error(err)
            results[index] = data.toString();
            count++;

            if(count==3) printResults(results);
        }));
    });
}

然而,由于某种原因,这会打印三次“未定义”。我碰巧找到了正确的解决方案,只需用一个函数替换 for 循环并将该函数的调用包含在另一个 for 循环中即可。

(...)


function httpGet (index) {
    http.get(process.argv[2+index], function(response) {
        response.pipe(bl(function(err,data){
            if(err) console.error(err)
            results[index] = data.toString();
            count++;

            if(count==3) printResults(results);
        }));
    });
}

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

但是,我不明白这种差异到底是如何使解决方案发挥作用的。谁能帮我解答一下吗?

最佳答案

在代码中,您传递对迭代变量的引用,因此在调用回调时,它等于 3。请参阅此示例:

编辑:我忘了总结,你的代码将无法工作,因为回调将所有结果设置为结果数组的索引 3,并且你打印出从 0 到 2 的索引

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

通过创建函数,您可以添加更多范围:

function fun(index){
  setTimeout(function(){
    console.log(index);
  }, 500);
}

for(var index = 0; index < 3; index++){
  fun(index);
}

您仍然可以使用匿名函数,但您需要使用如下范围包围它:

for(var index = 0; index < 3; index++){
  setTimeout((function(index){ 
    return function(){
      console.log(index);
    }    
  })(index), 500);
}

为了让它更清楚一点,我将使变量名称在不同范围内有所不同:

for(var outerIndexVariable = 0; outerIndexVariable < 3; outerIndexVariable++){
  setTimeout((function(innerIndexVariable){ 
    return function(){
      console.log(innerIndexVariable);
    }    
  })(outerIndexVariable), 500);
}

关于javascript - Node.js 中的异步 http.get 调用(Learyounode 练习),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577849/

相关文章:

javascript - 如何跟踪最新的请求异步调用

javascript - "Unsafe JavaScript attempt to access frame with URL..."错误在 Chrome webkit 检查器中不断生成

javascript - 将当前 url 传递到 chrome 扩展中的开发工具面板

javascript - Liferay javascript IE8

node.js - 将 header 添加到 307 重定向

javascript - 如何让 Express 路由默认需要身份验证?

javascript - 从 JSON 打印出与 HTML 中的转义字符相同的格式?

node.js - BitBucket 管道 - 使用 node/gulp/git ftp 构建和部署

javascript - 如何从需要返回语句的 GraphQL 解析器中调用异步 node.js 函数?

Mysql 和 ppoll