node.js - nodejs http请求,req.abort()和re.destory()的区别是什么?
迷茫
迷茫 2017-04-17 11:08:57
0
2
587

在nodejs中进行http请求,设置超时,如果是req.abort() 那么http 请求还会是继续的,但是re.destory()就会彻底中止,他们详细区别是什么?

还有个超时问题,分为请求超时和响应超时,以前没这个概念,最近才认识到这个细节,我想问问这两个分别意味着什么?测试一个资源快慢,应该以哪个为标准?


var http = require('http');

var request_timer = null, req = null;
request_timer = setTimeout(function() {
    req.destroy();
    console.log('Request Timeout.');
    console.log('1');
}, 1000);
// 请求5秒超时

var options = {
    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()是没有影响的。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(2)
洪涛

谢邀,在回家路上,所以长话短说:

  1. request.abort() 会中止一个已经发出的请求,但是你说请求还会继续是什么意思我看不懂,你是说执行它没有效果吗?

  2. re.destroy()?我只知道 socket.destroy(),不知道你这个指的是什么?socket.destroy() 会阻断当前 socket 上的一切 I/O 活动,不仅仅是 HTTP 请求。这个通常是用来应对错误,而不是取消请求。但是我不知道你问题中的 re 指的是什么,response 对象?好像没有 destroy 方法吧。

  3. 请求是出去,响应是回来,这俩超时肯定是在不同的阶段发生的。你问意味着什么……我觉得已经很明显了,一个出去一个回来,还能意味什么呀?

  4. 至于测试一个资源的快慢,应该是综合请求与响应的消耗来评定。如果你请求该资源迟迟得不到响应,你会感觉到慢;如果你请求很快得到响应,但是传输速度让人崩溃,你还是会觉得慢。反之亦然。

迷茫

re.destroy()
这个是继承socket上的方法,调用后实际是调用socket.destory() .

abort() 方法也会调用socket的destory

///这是node官方源码 http.js的包

ClientRequest.prototype.abort = function() {

// If we're aborting, we don't care about any more response data.
if (this.res)
this.res._dump();
else
this.once('response', function(res) {
res._dump();
});

if (this.socket) {
// in-progress
this.socket.destroy();////留意这里
} else {
// haven't been assigned a socket yet.
// this could be more efficient, it could
// remove itself from the pending requests
this._deferToConnect('destroy', []);
}
};

//可以看出它的关系 about() 会更干净点

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan