我有一个服务器端脚本,在给定的网址有1个页面视图后,在s3存储桶中动态创建一个js文件。服务器端脚本每1分钟运行一次。
在网站上的任何给定网址上,我都有一个尝试调用此动态创建文件的脚本。
如:
var host = window.location.host;
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
})();
问题是如果在网站上创建了一个新URL并且第一个访问者转到该页面,则cron作业有机会运行,因此存储桶中不存在js文件。这会导致404错误,但也会导致页面上的javascript错误导致包含它的js库崩溃。
有没有办法动态检查文件是否存在,如果尚未构建动态创建的文件,是否可以默认使用其他文件?
例如(伪代码):
try{
script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
}
catch(e){
404error = true;
}
finally{
if(404error == true){
script.src="https://s3.amazonaws.com/some_bucket/DEFAULT.js";
}
}
在出错时调用其他文件更新了代码。这成功调用了另一个文件,但它仍然会在Chrome中导致404错误。
var host = window.location.host;
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.onerror = function(){
var host = window.location.host;
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.src="https://s3.amazonaws.com/some_bucket/some_default_file.js";
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
}
script.src="https://s3.amazonaws.com/some_bucket/"+host+pathName+".js;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);
})();
答案 0 :(得分:0)
使用script.onerror
:
var pathName = window.location.pathname;
var script = document.createElement('script');
script.async = true;
script.type = 'text/javascript';
script.onerror = function() {
console.log('script failed to load');
};
script.src = "https://s3.amazonaws.com/some_bucket/" + host + pathName + ".js";
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(script, node);