因此,我正在向服务器发出此请求,并设置了超时,我想处理超时事件,但是我也想处理“中止”事件并使另一个事件不同。我设法快速修复,但是我想知道是否有更好的方法。代码如下:
makeRequest = function(json, cb){
var requestError
request({
url: REQUEST_URL,
json: json,
timeout: 3000,
headers: {
'Content-Type': 'application/json'
}
}, function(err, res, body){
if(err) requestError = err
else cb(null, res, body)
}).on('abort', function(){
setTimeout(function({
if(requestError != 'ETIMEDOUT') cb(httpStatusCode.REQUEST_TIMEDOUT)
else cb(httpStatusCode.REQUEST_ABORTED
}, 1000)
})
}
我注意到,在超时事件中,均以该顺序触发了“中止”事件并调用了请求回调,因此我使用了setTimeout函数来等待请求回调,然后处理“中止”侦听器中的错误。这似乎是一种愚蠢的方式,我在网上搜索,但没有找到一种仅处理回调事件的方式。我还注意到超时会触发on。('error',function(err){})事件,我可以在其中处理错误,但它还会调用on。('abort',function(){})事件我最终两次调用主回调(cb),导致应用程序崩溃。
有没有一种方法可以使事件仅用于超时而仅使事件具有中止,因此我不必使用setTimeout?
还是我的req对象中有任何属性可以检查该请求是否超时?
还是您有其他建议以不太丑陋的方式解决我的问题?
我正在使用nodejs 0.12.2并要求2.55.0谢谢!
开源的一大优点是,您始终可以仅查看模块代码并查看其工作方式。
如果您想要错误,则只需收听.on('error', function(err) {})
。错误将在那里传递。该.on('abort', function() {})
事件不会告诉您为什么它被中止。但是,从请求模块的相关源代码中可以看到,该error
事件总是在该abort
事件之后立即发送,并且将其e.code
设置为ETIMEDOUT
。
这是有关when的一些相关源代码的副本.abort()
,您可以在该代码中看到此后立即触发错误事件:
if (self.timeout && !self.timeoutTimer) {
var timeout = self.timeout < 0 ? 0 : self.timeout
self.timeoutTimer = setTimeout(function () {
self.abort()
var e = new Error('ETIMEDOUT')
e.code = 'ETIMEDOUT'
self.emit('error', e)
}, timeout)
// Set additional timeout on socket - in case if remote
// server freeze after sending headers
if (self.req.setTimeout) { // only works on node 0.6+
self.req.setTimeout(timeout, function () {
if (self.req) {
self.req.abort()
var e = new Error('ESOCKETTIMEDOUT')
e.code = 'ESOCKETTIMEDOUT'
self.emit('error', e)
}
})
}
}
因此,似乎您可以忽略该abort
事件,而只是侦听该error
事件,并仅对该事件调用回调error
。
如果您的代码使回调函数被多次调用而出错(听起来像是一个错误),那么它就会变得混乱,那么您可以更改makeRequest()
函数,以使它永远也不会多次调用回调函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句