我正在尝试编写一个函数,该函数接受所有标记为attribute-data
的css / js文件,并刷新是否在服务器端修改了任何脚本。我的initial attempt涉及php和jquery / javascript。这个新尝试仅基于javascript / jquery!
我的问题是,在将ajax请求链接到这些文件时(对于修改日期),如果找不到文件,则所有ajax请求都会停止。例如,如果我将(现有)style.css重命名为(不存在)style_.css,则所有链接的ajax请求都将中止,并且代码不会继续。
var file_url = [url1, url1, url3, url4, url5];
function getLatestModificationDate(file_url){
$.when.apply($, file_url.map(function(url) {
return $.ajax({ type: 'HEAD', url: url, beforeSend: function(jqXHR, settings) { jqXHR.url = settings.url; } });
})).done(function() {
var results = [], lastModified, file_jqXHR;
//each argument passed to this callback for ajax, is of this form [data, statusText, jqXHR]
for (var i = 0; i < arguments.length; i++) {
var obj= {};
file_jqXHR = arguments[i][2]; //jqXHR
lastModified = file_jqXHR.getResponseHeader('Last-Modified');
obj['file'] = file_jqXHR.url;
obj['modDate'] = lastModified;
fileArray.push(obj);
}
mainFunction(fileArray); //the main function, not in scope for this question.
});
}
我尝试在error
之后在ajax中添加beforeSend
选项,但不允许继续保留ajax请求。不知道是否return ajax apply(.., ..)
可以返回false以跳过404
的当前请求,因为我不知道如何跳过或返回ajax的false?有没有快速的方法来检查文件是否存在?因此,我只将现有文件添加到传递给file_url
function getLatestModificationDate(file_url){...}
数组中
编辑:以下是Chrome控制台的屏幕截图。
编辑:
我发现this question's answer使用了针对ajax完整版本的新版本...有人可以提供有关如何将该代码用于我的问题的任何简化吗?谢谢!
var myDeferred = $.Deferred();
var origDeferred = $.ajax(...);
// if request is ok, i resolve my deferred
origDeferred.done(function() {
myDeferred.resolve.apply(this, arguments);
});
// if request failed, i also resolve my deferred
origDeferred.fail(function() {
myDeferred.resolve.apply(this, arguments);
});
答案 0 :(得分:0)
您可以使用Try-Catch块:
for (var i = 0; i < arguments.length; i++) {
try{
var obj= {};
file_jqXHR = arguments[i][2]; //jqXHR
lastModified = file_jqXHR.getResponseHeader('Last-Modified');
obj['file'] = file_jqXHR.url;
obj['modDate'] = lastModified;
fileArray.push(obj);
}catch(e){}
}