Mein AJAX-Code lautet wie folgt:

data = new FormData();
   //  data="";
    paths = "";


    // Create a new HTTP requests, Form data item (data we will send to the server) and an empty string for the file paths.
    xhr = new XMLHttpRequest();


    // Set how to handle the response text from the server
    xhr.onreadystatechange = function(ev){
        //console.debug(xhr.responseText);
     //  console.log("success"+xhr.responseText);

    try{
      console.log($.parseJSON(xhr.responseText));

       var data=$.parseJSON(xhr.responseText);

      if(data.success=="yes"){

          projectCounter++;            
          var projectName=$.parseJSON(data.arguments);
          console.log(projectName.projectName);

          console.log('update table');

          if(projectCounter==2){

              UploadComplete(projectName.projectName);

          }


      }

     } 
     catch(e){}

    };

    // Loop through the file list
    for (var i in files){
        // Append the current file path to the paths variable (delimited by tripple hash signs - ###)
        paths += files[i].webkitRelativePath+"###";
        // Append current file to our FormData with the index of i
        data.append(i, files[i]);
    };
    // Append the paths variable to our FormData to be sent to the server
    // Currently, As far as I know, HTTP requests do not natively carry the path data
    // So we must add it to the request manually.
    data.append('paths', paths);
    // console.log(paths);   
    // Open and send HHTP requests to upload.php
    xhr.open('POST', "upload.php", true);
     console.log(data);   

    xhr.send(this.data);

Das Problem, mit dem ich konfrontiert bin, ist, dass es zweimal eine http-Anfrage sendet. Ich erhalte 2-mal eine HTTP-Antwort. Ich habe console.log ("update Table") geschrieben und es wird 2 mal angezeigt. Ich bin sehr verwirrt, warum ich 2-mal eine HTTP-Antwort erhalte, anstatt dass ich nur eine Anfrage sende.

0
Muneem Habib 25 Nov. 2013 im 15:39

3 Antworten

Beste Antwort

Sie erhalten im Verlauf einer Anfrage mehrere readyState-Ereignisse. Was Sie hier möchten, ist, erst benachrichtigt zu werden, wenn die Anforderung abgeschlossen ist.

Erweitern Sie Ihren Handler damit:

if(xhr.readyState === 4  //ready) {

}

AKTUALISIEREN: Das ursprüngliche Problem wurde mit einer einfachen Gleichheitsprüfung (untypisiert) gelöst, was zu der Annahme führt, dass in einigen Browsern der readyState ein string typed field ist, der ein number enthält.

if(xhr.readyState == 4  //ready) {

}
0
Peter Aron Zentai 28 Nov. 2013 im 12:44

Ich denke, das Problem ist, dass Sie den readyState-Wert von xhr nicht überprüfen. Der onreadystatechange-Rückrufcode sollte mit einer if-Anweisung versehen werden:

if (xhr.readyState === 4) {
    // your code here...
}

Nur wenn der readyState 4 ist, wird die Anforderung tatsächlich ausgeführt.

Grüße, Udi

0
Udi Cohen 25 Nov. 2013 im 11:44

Sie testen das readyState nicht in Ihrem onreadystatechange Handler. Die Funktion wird jedes Mal ausgelöst, wenn sich der Status ändert. Es ist üblich, die Funktion abzubrechen (durch Zurückgeben), wenn der readyState nicht erledigt ist.

xhr.onreadystatechange = function(ev){
    if (this.readyState !== 4) {
        return;
    }
    // ...
0
Quentin 25 Nov. 2013 im 11:43