nodejs发送http请求时遇到404长时间未响应的解决方法

2020-06-17 07:02:28易采站长站整理


function httpGetWithTimeoutSupport(options, timeout, callback) {
var timeoutEvent;

var req = http.get(options, function(res) {
res.on("end", function() {
clearTimeout(timeoutEvent);
// console.log("end");
})
res.on("close", function(e) {
clearTimeout(timeoutEvent);
// console.log("close");
})

res.on("abort", function() {
// console.log("abort");
});

res.on("error",function(){
try{
res.destory();
clearTimeout(timeoutEvent);
//console.log("res error catch");
}catch(e){

}
});
callback(res);
});

req.on("timeout", function() {
//console.log("request emit timeout received");
try{
if (req.res) {
req.res.emit("abort");
}
clearTimeout(timeoutEvent);
req.abort();
}catch(e){
//console.log("req timeout failed!");
}
});
req.on("error",function(){
try{
//console.log("req error catch");
}catch(e){

}
});
timeoutEvent = setTimeout(function() {
try{
req.emit("timeout");
}catch(e){
//console.log("timeout failed!");
}
}, timeout);

return req;
}

其原理就是利用nodejs请求的几个事件与计时器,一旦超出设定的响应时长则立马终结请求。如此,进度条一直卡着的问题解决了。
细心的读者可能看到了


path.exists(filename, function(exists) {
if (exists) {
readFileEntry(filename,that.res);
}else{...});

这段代码,其实这里做了一下服务端的图片缓存,一旦加载过的底图图片,直接从本地读取,极大的加快了地图的访问速度(这个在效率上提升了至少10倍)。
至于Arcgis API for Silverlight 是如何实现天地图底图以及其它底图服务(比如非标准墨卡托的地方坐标系底图服务)加载的呢?请听我下回分解。