• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

jQuery Ajax: Zuordnung von Response zu Abfrage

Gilles

Blogger
Hallo zusammen,
ich möchte eine Aktualitätsprüfung von Dateien anhand des Modified Datums machen.
Also praktisch:

- Hole Header für Datei A und vergleiche das Last-Modified Datum mit dem Datenbank-Eintrag.
- Wenn das Datum von Datei A neuer ist wird die Datei komplett geladen.

Für eine Datei krieg ich das auch einfach hin.
Nun mache ich aber folgendes:

HTML:
for(var i=0; i < files.length; i++) {
      $.ajax({
        "type" : "HEAD",
        "async" : true,
        "url" : files[i],
        "dataType" : "text",
        "success" : fileLoaded,
        "error" : fileError       
    }); 
}

var fileLoaded = function(message,text,response) {
    log.debug("::fileLoaded");
    answers.success++;
    answers.complete++;
    answers.items.push(response.getAllResponseHeaders());
    checkComplete();
  };

Nun sende ich nacheinander ca 3-4 Requests ab. Diese können dann in beliebiger Reihenfolge antworten.
Wie kann ich aber nun wissen welcher Response von welcher Datei ist. Ich hatte nämlich zuerst im Response-Header etwas erwartet. Mit response.getAllResponseHeaders hab ich mir den Header geben lassen. Leider war nichts brauchbares dabei. Kennt ihr da einen Trick?

Viele Grüße,
Gilles
 
Zuletzt bearbeitet:
Werbung:
Werbung:
Sendet der Server auch diesen Header?
Falls du es mit Firefox + Firebug ausprobiert hast und kein Ergebnis bei response.getAllResponseHeaders bekommen hast liegt das an dem Firefox Bug :)
Im Chrome hab ich einen Header bekommen.
Leider hatte dieser keine Location mitgeliefert und auch sonst keinen Hinweis auf den Dateinamen. Ich habe das Ganze jetzt aber lösen können. Auch wenn ich die Request-Url nicht aus dem response auslesen konnte habe ich nun folgende Lösung:

Code:
function FileHeaderLoader(_options) {
  
  var answers = [];
  var response = {
    "complete" : 0,
    "success" : 0,
    "error" : 0,
    "items" : []
  };
  
  var options = {
    "files" : [],
    "callback" : function(response) { alert("Es wurde kein Callback angegeben");}
  };
  $.extend(true, options, _options);
  
  this.startLoad = function() {
  console.debug("::startLoad");
  console.debug("file length: "+options.files.length);
  
     for(var i=0; i < options.files.length; i++) {
     console.debug("go for answer "+i);
      answers[i] = $.ajax({
        "type" : "HEAD",
        "async" : true,
        "url" : options.files[i],
        "dataType" : "text",
        "success" : fileLoaded,
        "error" : fileError       
        }); 
     }
  };
  
  var fileLoaded = function() {
  console.debug("::fileLoaded");
    response.success++;
    response.complete++;
    //items.items.push(response.getAllResponseHeaders());
    checkComplete();
  };
  
  var fileError = function() {
  console.debug("::fileError");
    response.error++;
    response.complete++;
  };
  
  var checkComplete = function() {
    if(options.files.length <= response.complete) {
      for(var i=0; i < options.files.length; i++) {
        response.items.push({
          "request" : options.files[i],
          "response" : answers[i].getAllResponseHeaders()
        });
      }
    }
    
    options.callback(response);
  };
  
  
  var clearItems = function() {
    items = {
     "complete" : 0,
     "success" : 0,
     "error" : 0
    };
  };
  
  this.startLoad();
}


new FileHeaderLoader({
   "files" : ["datei.jpg"],
    "callback" : function(answers) { console.debug("ANSWERS", answers);}
  });




Das funktioniert wunderbar. hab auch noch eine Erweiterung, wo man die Feldnamen angeben kann, die man aus dem Header haben will (Dann funktioniert es auch zu 100% im FF ;)).
 
Zurück
Oben