Javascript Nodejs http请求不从递归函数调用
我有一个奇怪的情况 我需要发送请求3次或直到我得到正确的答复Javascript Nodejs http请求不从递归函数调用,javascript,node.js,Javascript,Node.js,我有一个奇怪的情况 我需要发送请求3次或直到我得到正确的答复 var connect = function(){ console.log('first step'); var connector = http.request(some_options, function(resp) { console.log('sec step'); resp.on("data", function(chunk){ str += chunk; });
var connect = function(){
console.log('first step');
var connector = http.request(some_options, function(resp) {
console.log('sec step');
resp.on("data", function(chunk){
str += chunk;
});
resp.on("end", function() {
console.log('third step');
if (resp.statusCode != 200){
return false
}
else{
var rep = 3;
var i = 1;
(function retry_connect(){
if ((i <= rep) && JSON.parse(str).hasOwnProperty('error')) {
console.log('reconnect');
connect();
i++;
setTimeout(function(){retry_connect()}, 3000);
}
else{
return true
}
}());
}
});
});
};
connect();
可以解释为什么不从retry_connect()函数调用连接器吗
谢谢您的http请求可能会发出错误, 尝试添加:
connector.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
顺便说一句,你的返回语句不会做任何事情,也可以省略它们
此外,http.request是一个异步函数(因此,connect的返回是异步的)
您迭代i…rep并递归调用connect(),并设置超时以调用retry\u connect
总共3次,这反过来也会做同样的事情,但现在又多了3次,等等
我会告诉你你对总体反应的兴趣
function connect (opts, callback, count) {
if (count > 3) {
console.log('retry limit reached');
callback({error:'retry limit reached'});
} else {
var request = http.request(opts, function (response) {
var buffer = [];
response.on('data', function (chunk) {
buffer.push(chunk);
});
response.on('end', function () {
var data = buffer.join('');
if (response.statusCode !== 200) {
console.log('did not receive a 200 OK');
callback({error: {statusCode: response.statusCode}});
} else {
//200 OK but the json data might contain an error
var parsed = JSON.parse(data);
if (parsed.error) {
count = (count||0) +1;
console.log('retrying in ' + (count * 3000));
setTimeout(function () {
console.log('retrying now');
connect(opts, callback, count);
}, 3000 * count);
} else {
console.log('200 OK and no error in json, calling callback with parsed json response');
callback(null, parsed);
}
}
});
});
request.on('error', function (error) {
console.log('request error', error);
callback({error:error});
});
}
}
connect({host: 'example.com'}, function (err, data) {
if (err) {
console.log('something went wrong:', err);
} else {
console.log('request done:', data);
}
});
因为所有这些都是异步的,所以当事情完成/失败时,你需要某种机制来发出信号,我使用回调来实现这一点。这很有趣。你确定不是从别的地方打过来的吗?您可以尝试使用
console.trace()
而不是console.log('first step')
在启动新请求之前是否尝试过关闭请求?哦,是的。我试过了,但我想我用错了代码块。我是在console.log('reconnect')
之后做的。在我关闭了闭包外部的连接之后,脚本将正确运行。谢谢你的主意!谢谢我尝试在脚本中使用回调,这种方法似乎更合适。但在启动一个新的连接之前,我必须考虑关闭连接。请告诉我为什么这个方法在POST请求上不起作用?你有一个例子吗?request.write(…)和request.end()应该可以正常工作(将它们添加到request.on('error')之后,在调用request.end之后,请求将被处理
function connect (opts, callback, count) {
if (count > 3) {
console.log('retry limit reached');
callback({error:'retry limit reached'});
} else {
var request = http.request(opts, function (response) {
var buffer = [];
response.on('data', function (chunk) {
buffer.push(chunk);
});
response.on('end', function () {
var data = buffer.join('');
if (response.statusCode !== 200) {
console.log('did not receive a 200 OK');
callback({error: {statusCode: response.statusCode}});
} else {
//200 OK but the json data might contain an error
var parsed = JSON.parse(data);
if (parsed.error) {
count = (count||0) +1;
console.log('retrying in ' + (count * 3000));
setTimeout(function () {
console.log('retrying now');
connect(opts, callback, count);
}, 3000 * count);
} else {
console.log('200 OK and no error in json, calling callback with parsed json response');
callback(null, parsed);
}
}
});
});
request.on('error', function (error) {
console.log('request error', error);
callback({error:error});
});
}
}
connect({host: 'example.com'}, function (err, data) {
if (err) {
console.log('something went wrong:', err);
} else {
console.log('request done:', data);
}
});