我试图有一个带有http.get请求的循环 - 我不知道为什么函数没有启动。 我的代码是:
while(List.length>0) {
if(counter < Limit) { // Limit is the amount of requests I want to
counter++;
inProcess++;
var scanitem = List.pop();
var body = "";
var url = 'https://www.mywebsite.com/'+scanitem;
var options = {
path: url,
method: 'GET'
};
console.log(url); // This part is happenning
var _request = https.get(options, function (res) {
console.log('get web site');// this part is NOT showup.
res.on('data', function (chunk) {
console.log(chunk); // this part is NOT showup.
body += chunk.toString();
});
res.on("end", function() {
console.log(body);// this part is NOT showup.
});
res.on("error", function(error) {
console.log('error')// this part is NOT showup.
});
});
_request.end();
}
else {
console.log('list BREAK');} // This part is happenning after the limit crossed
答案 0 :(得分:0)
当传递Object
作为第一个参数时,URL应分解为单个部分:
var options = {
method: 'GET',
protocol: 'https:',
hostname: 'www.mywebsite.com',
path: '/' + scanitem
};
var _request = https.get(options, ...);
options
涵盖了所使用的https.get()
,String
是https.get()
的便利变体。
您也可以传递网址var _request = https.get(url, ...);
,var body = "";
将为您运行https.request()
:
while
JavaScript没有块范围的变量(url.parse()
)。因此,尽管位置为body
,但scanitem
循环的每次迭代仍然会附加到同一url
。
当变量仅由options
,https.get()
和function
等同步任务使用时,这并不是一个问题。但是,当混合使用List
这样的异步任务时,你不可能得到你期望的结果。
在目前没有块范围变量的情况下,您可以使用yet创建额外的Array
范围。
由于function
似乎是List.forEach(function (scanitem) {
var body = '';
var url = 'https://www.mywebsite.com/'+scanitem;
https.get(url, function (res) {
// etc.
});
});
,您可以使用带closure的迭代器Limit
:
.splice()
而且,对于Array
,您可以使用List.splice(0, Limit).forEach(function (scanitem) {
// etc.
});
删除并使用您想要的https.request()
部分:
_request.end()
此外,与https.get()
不同,使用{{1}}时,您无需致电{{1}}。