为了账号安全,请及时绑定邮箱和手机立即绑定

nodejs http请求,req.abort()和re.destory()的区别是什么?

nodejs http请求,req.abort()和re.destory()的区别是什么?

湖上湖 2019-04-08 11:18:54
在nodejs中进行http请求,设置超时,如果是req.abort()那么http请求还会是继续的,但是re.destory()就会彻底中止,他们详细区别是什么?还有个超时问题,分为请求超时和响应超时,以前没这个概念,最近才认识到这个细节,我想问问这两个分别意味着什么?测试一个资源快慢,应该以哪个为标准?varhttp=require('http');varrequest_timer=null,req=null;request_timer=setTimeout(function(){req.destroy();console.log('RequestTimeout.');console.log('1');},1000);//请求5秒超时varoptions={host:'www.baidu.com',port:80,path:'/'}req=http.get(options,function(e){clearTimeout(request_timer);}).on('error',function(err){if(request_timer){clearTimeout(request_timer);console.log('2');}console.log('3');});假设timeout设置为1ms(测试强制超时),req.destroy()的话超时输出到3,直接退出,但是如果是req.abort()的话,等到输出3会过一会才会退出,按照nightire的说法,可能是请求已经发出,等待响应,所以req.abort()是没有影响的。
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

谢邀,在回家路上,所以长话短说:
request.abort()会中止一个已经发出的请求,但是你说请求还会继续是什么意思我看不懂,你是说执行它没有效果吗?
re.destroy()?我只知道socket.destroy(),不知道你这个指的是什么?socket.destroy()会阻断当前socket上的一切I/O活动,不仅仅是HTTP请求。这个通常是用来应对错误,而不是取消请求。但是我不知道你问题中的re指的是什么,response对象?好像没有destroy方法吧。
请求是出去,响应是回来,这俩超时肯定是在不同的阶段发生的。你问意味着什么……我觉得已经很明显了,一个出去一个回来,还能意味什么呀?
至于测试一个资源的快慢,应该是综合请求与响应的消耗来评定。如果你请求该资源迟迟得不到响应,你会感觉到慢;如果你请求很快得到响应,但是传输速度让人崩溃,你还是会觉得慢。反之亦然。
                            
查看完整回答
反对 回复 2019-04-08
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

re.destroy()
这个是继承socket上的方法,调用后实际是调用socket.destory().
abort()方法也会调用socket的destory
///这是node官方源码http.js的包
ClientRequest.prototype.abort=function(){
//Ifwe'reaborting,wedon'tcareaboutanymoreresponsedata.
if(this.res)
this.res._dump();
else
this.once('response',function(res){
res._dump();
});
if(this.socket){
//in-progress
this.socket.destroy();////留意这里
}else{
//haven'tbeenassignedasocketyet.
//thiscouldbemoreefficient,itcould
//removeitselffromthependingrequests
this._deferToConnect('destroy',[]);
}
};
//可以看出它的关系about()会更干净点
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 558 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信