同一个页面里面可能有别的js文件,也引用了这个加载超时的文件以后称为此文件,但是,这两个文件中因为此文件的路径写的不一致,例如一个文件中写的是在requirejs配置文件中配置的此文件的而另一个文件中写的是关于此文件的相对路径或者全。
解决方法所以,将他们引用此文件的方式改为一致即可。注意各个模块引用同一个文件的方式要一致。若是一个公共文件,在requirejs的配置文件中做了配置,那么其他模块在引入时都按照requirejs的配置文件的方式来引用,否则,可能会造成在一个页面中出现同一个文件的两种不同引用方式。
引用链接,加载js超时需要修改配数。brrequireJs的加载是一种异步机制,它加载js的时候有个默认的超时机制,因为网络原因或者资源找不到等原因引起的。
可以修改配置参数waitSeconds默认为7秒,可以设置为0表示永远不超时,或者大一点的数字,一般情况加载超时是静态资源过大造成或者是加载网络资源阻断。
function requestWithTimeout(options,timeout,callback){var timeoutEventId,
req=http.request(options,function(res){
res.on('end',function(){
clearTimeout(timeoutEventId)
console.log('response end...')
})
res.on('close',function(){
clearTimeout(timeoutEventId)
console.log('response close...')
})
res.on('abort',function(){
console.log('abort...')
})
callback(res)
})
req.on('timeout',function(e){
if(req.res){
req.res('abort')
}
req.abort()
})
timeoutEventId=setTimeout(function(){
req.emit('timeout',{message:'have been timeout...'})
},timeout)
return req
}
我们可用这样来调用requestWithTimeout方法:
var http=require('http')
var options = {
host: 'dict.youdao.com',
port: 80,
method: 'GET'
}
var req=requestWithTimeout(options,4000,function(res){
res.on('data',function(chunk){
console.log('body:'+chunk)
})
})
req.on('error',function(e){
console.log('error got :' + e.message)
}).on('timeout',function(e){
console.log('timeout got :'+ e.message)
})
req.end()
代码比较简单,也能很好地处理超时,但是,重新定义一个方法显得不怎么好,能否让http.request方法直接支持timeout呢?也就是说,直接在options参数中支持timeout属性。我们可用重写http.request方法,如下:
http.request=(function(_request){
return function(options,callback){
var timeout=options['timeout'],
timeoutEventId
var req=_request(options,function(res){
res.on('end',function(){
clearTimeout(timeoutEventId)
console.log('response end...')
})
res.on('close',function(){
clearTimeout(timeoutEventId)
console.log('response close...')
})
res.on('abort',function(){
console.log('abort...')
})
callback(res)
})
//超时
req.on('timeout',function(){
req.res &&req.res.abort()
req.abort()
})
//如果存在超时
timeout &&(timeoutEventId=setTimeout(function(){
req.emit('timeout',{message:'have been timeout...'})
},timeout))
return req
}
})(http.request)
调用就更直观了,和普通的request调用没啥区别,只是传入的options中多了timeout属性。
var http=require('http')
var options = {
host: 'dict.youdao.com',
port: 80,
method: 'GET',
timeout:3000
}
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode)
console.log('HEADERS: ' + JSON.stringify(res.headers))
res.on('data', function (chunk) {
console.log('BODY: ' + chunk)
})
})
req.on('error',function(e){
console.log("error got :"+e.message)
}).on('timeout',function(e){
console.log('timeout got :'+e.message)
})
req.end()
这样,我们就让http请求支持超时了