Ra1*_*den 3 javascript asynchronous node.js
我正在学习用Node.js的learnyounode.我遇到了问题JUGGLING ASYNC.问题描述如下:
作为命令行参数,您将获得三个URL.您应该http.get()调用从这些URL获取数据,然后按照与参数列表中的顺序相同的顺序打印它们.这是我的代码:
var http = require('http')
var truecount = 0;
var printlist = []
for(var i = 2; i < process.argv.length; i++) {
http.get(process.argv[i], function(response) {
var printdata = "";
response.setEncoding('utf8');
response.on('data', function(data) {
printdata += data;
})
response.on('end', function() {
truecount += 1
printlist.push(printdata)
if(truecount == 3) {
printlist.forEach(function(item) {
console.log(item)
})
}
})
})
}
Run Code Online (Sandbox Code Playgroud)
这是我不明白的问题:我正在尝试response.on('end', function(){})使用字典将完成的数据存储到每个URL中.但是,我不知道如何得到这个网址http.get().如果我可以在里面做一个局部变量http.get(),那就太好了但我想每当我声明一个变量时var url,它总是指向最后一个url.因为它是全局的并且它通过循环不断更新.我将这些已完成数据存储为密钥等于url的值的最佳方法是什么?
Law*_*nes 12
这就是我要解决问题的方法.
#!/usr/bin/env node
var http = require('http');
var argv = process.argv.splice(2),
truecount = argv.length,
pages = [];
function printUrls() {
if (--truecount > 0)
return;
for (i = 0; i < pages.length; i++) {
console.log(pages[i].data + '\n\n');
}
}
function HTMLPage(url) {
var _page = this;
_page.data = '### [URL](' + url + ')\n';
http.get(url, function(res) {
res.setEncoding('utf8');
res.on('data', function(data) {
_page.data += data;
});
res.on('end', printUrls);
});
}
for (var i = 0; i < argv.length; i++)
pages.push(new HTMLPage(argv[i]));
Run Code Online (Sandbox Code Playgroud)
它在每个请求开始时将请求添加到数组中,这样一旦完成,我可以很好地通过响应迭代,知道它们的顺序正确.
在处理异步处理时,我发现将每个进程视为具体的开始和结束更容易.如果您需要保留请求的顺序,则必须在创建每个进程时进行输入,然后在完成时返回该记录.只有这样才能保证你的东西顺序正确.
如果你不顾一切地使用上面的方法,那么你可以在你的get回调闭包中定义一个变量并使用它来存储url,这样你就不会最后一个url覆盖你的变量了.但是,如果你这样做,当你必须使用process.argv中的url来按顺序访问每个响应时,你将大大增加你的开销.我不建议.
| 归档时间: |
|
| 查看次数: |
2662 次 |
| 最近记录: |