How to continue ajax remaining requests if file not found?

346 views Asked by At

I'm trying to script a function which takes all the css/js files marked by attribute-data and refreshes if any of the scripts have been modified on the server side. My initial attempt involved php and jquery/javascript. This new attempt is based on javascript/jquery only!

My problem is that while chaining the ajax requests to these files (for Modification date), all ajax requests stop if file not found. For example, if I rename (existing) style.css to (doesn't exist) style_.css, all the chained ajax requests get aborted, and the code doesn't continue.

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.
    });
  }

I tried adding error option in ajax after beforeSend, that didn't allow continuing of remaining ajax requests. Don't know if return ajax apply(.., ..) could return false to skip the current request for 404, cause I don't know how to skip or return false for the ajax? Is there any quick way to check if the file exists? So that I add only existing files to the file_url array that's passed to the function getLatestModificationDate(file_url){...}

EDIT: Here's a screenshot from the Chrome-Console.

Ajax Error

EDIT :

I found this question's answer that uses a new deffered for the ajax complete... could someone provide any simplification on how that code can be used for my question? Thanks!

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);
});
1

There are 1 answers

2
Siamak Ferdos On

You can use Try-Catch block:

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){}
}