- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在通过做 learnyounode exercises from nodeschool 来学习 Node .在第 8 个练习中,他们要求编写一个执行以下操作的程序:
他们简要提到了异步库的存在,这有助于计算回调,但他们也邀请在没有它们的情况下完成练习。我最初的解决方案如下:
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);
}));
});
}
然而,出于某种原因,这打印了三次“undefined”。我碰巧找到了正确的解决方案,只需用一个函数替换 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 调用(学习 Node 练习),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577849/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
介绍篇 什么是MiniApis? MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述
我正在从“JavaScript 圣经”一书中学习 javascript,但我遇到了一些困难。我试图理解这段代码: function checkIt(evt) { evt = (evt) ? e
package com.fastone.www.javademo.stringintern; /** * * String.intern()是一个Native方法, * 它的作用是:如果字
您会推荐哪些资源来学习 AppleScript。我使用具有 Objective-C 背景的传统 C/C++。 我也在寻找有关如何更好地开发和从脚本编辑器获取更快文档的技巧。示例提示是“查找要编写脚本的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 6年前关闭。 Improve this
我是塞内加尔的阿里。我今年60岁(也许这是我真正的问题-笑脸!!!)。 我正在学习Flutter和Dart。今天,我想使用给定数据模型的列表(它的名称是Mortalite,请参见下面的代码)。 我尝试
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
学习 Cappuccino 的最佳来源是什么?我从事“传统”网络开发,但我对这个新框架非常感兴趣。请注意,我对 Objective-C 毫无了解。 最佳答案 如上所述,该网站是一个好地方,但还有一些其
我正在学习如何使用 hashMap,有人可以检查我编写的这段代码并告诉我它是否正确吗?这个想法是有一个在公司工作的员工列表,我想从 hashMap 添加和删除员工。 public class Staf
我正在尝试将 jQuery 与 CoffeScript 一起使用。我按照博客中的说明操作,指示使用 $ -> 或 jQuery -> 而不是 .ready() 。我玩了一下代码,但我似乎无法理解我出错
还在学习,还有很多问题,所以这里有一些。我正在进行 javascript -> PHP 转换,并希望确保这些做法是正确的。是$dailyparams->$calories = $calories;一条
我目前正在学习 SQL,以便从我们的 Magento 数据库制作一个简单的 RFM 报告,我目前可以通过导出两个查询并将它们粘贴到 Excel 模板中来完成此操作,我想摆脱 Excel 模板。 我认为
我知道我很可能会因为这个问题而受到抨击,但没有人问,我求助于你。这是否是一个正确的 javascript > php 转换 - 在我开始不良做法之前,我想知道这是否是解决此问题的正确方法。 JavaS
除了 Ruby-Doc 之外,哪些来源最适合获取一些示例和教程,尤其是关于 Ruby 中的 Tk/Tile?我发现自己更正常了 http://www.tutorialspoint.com/ruby/r
我只在第一次收到警告。这正常吗? >>> cv=LassoCV(cv=10).fit(x,y) C:\Python27\lib\site-packages\scikit_learn-0.14.1-py
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!