“杂耍异步” - 为什么我的解决方案根本不返回任何内容
'Juggling Async' - Why does my solution not return anything at all?
在提出一个问题并得到一个非常有用的答案后,learnyounode
中的"异步杂耍"作业要求我做什么,我开始自己实现它。
问题是,我的设置没有任何成功! 即使我已经参考了其他解决方案,当我执行learnyounode verify myscript.js
时,我的设置根本没有返回任何结果。
GIST:杂耍异步.js
var http = require('http');
var app = (function () {
// Private variables...
var responsesRemaining,
urls = [],
responses = [];
var displayResponses = function() {
for(var iterator in responses) {
console.log(responses[iterator]);
}
};
// Public scope...
var pub = {};
pub.main = function (args) {
responsesRemaining = args.length - 2;
// For every argument, push a URL and prep a response.
for(var i = 2; i < args.length; i++) {
urls.push(args[i]);
responses.push('');
}
// For every URL, set off an async request.
for(var iterator in urls) {
var i = iterator;
var url = urls[i];
http.get(url, function(response) {
response.setEncoding('utf8');
response.on('data', function(data) {
if(response.headers.host == url)
responses[i] += data;
});
response.on('end', function() {
if(--responsesRemaining == 0)
displayResponses();
});
});
}
};
return pub;
})();
app.main(process.argv);
问题:我做错了什么?
此行
for(var iterator in urls) {
不做你想的那样。它实际上循环访问urls
的属性(请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in)。相反,你必须做一些类似的事情
for(var i = 0; i < urls.length; i++) {
var url = urls[i];
...
}
或
urls.forEach(function(url, index) {
...
});
除了没有正确循环app
模块内的数组外,我也没有正确连接从response.on('data')
事件返回data
。 本来我在做...
responses[index] += data;
相反,正确的做法是:
responses[index] = responses[index] + data;
改变这一点,以及@arghbleargh注意到的事情,得到了"异步杂耍"的充分验证!
我已经测试了我的代码,它都有效:
~ $ node juggling_async.js site1 site2 site3 site4 ...
JS代码不仅限于三个站点。
var http = require('http');
// Process all the site-names from the arguments and store them in sites[].
// This way does not limit the count to only 3 sites.
var sites = [];
(function loadSites() {
for(var i = 2, len = process.argv.length; i < len; ++i) {
var site = process.argv[i];
if(site.substr(0, 6) != 'http://') site = 'http://' + site;
sites.push(site);
}
})();
var home_pages = [];
var count = 0;
function httpGet(index) {
var home_page = '';
var site = sites[index];
http.get(site, function(res) {
res.setEncoding('utf8');
res.on('data', function(data) {
home_page += data;
});
res.on('end', function() {
++count;
home_pages[index] = home_page;
if(count == sites.length) {
// Yahoo! We have reached the last one.
for(var i = 0; i < sites.length; ++i) {
console.log(''n@@@@@@@@@@@@ Site #' + (+i+1) + ': ' + sites[i]);
console.log(home_pages[i]);
console.log('============================================'n');
}
}
});
})
.on('error', function(e) {
console.log('Error at loop index ' + inddex + ': ' + e.message);
})
;
}
for(var i = 0; i < sites.length; ++i) {
httpGet(i);
}
相关文章:
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 元素在通过单击链接隐藏后重新出现(需要不包含返回 false 或 preventDefault 的解决方案)
- “杂耍异步” - 为什么我的解决方案根本不返回任何内容
- Node.js解决方案用于XMPP BOSH预绑定以返回SID和RID
- 按下按钮我的网页正在重新加载?我尝试过从js返回false之类的方法,但仍然没有解决方案
- 获取插入符号位置的常见解决方案会返回奇怪的结果
- 循环遍历数组以查找匹配并返回所有可能的解决方案
- 无法用Angular从HTML视图获取值到控制器.解决方案返回$scope变量undefined
- 数组的数组或使用相同var返回不同值的另一种解决方案
- 为什么我的VowelCount函数没有返回正确的解决方案
- 递归解决方案:字符串排列.无法在javascript中返回排列字符串数组
- AngularJs:返回已经找到的嵌套$http解决方案的承诺,但为什么它能工作
- 解析消息并返回 json 的更干净的解决方案
- PHP返回按钮的终极HTTP_REFERER解决方案
- Javascript计算排列——为什么当我不复制数组时,我的代码返回不需要的解决方案?