Uri: location.href verhindert AJAX-Request

Hi,

Ich möchte einen AJAX-Request schicken und im Anschluss location.href machen. Wenn ich kein location.ref mache, dann funktioniert mein Ajax-Request, sobald ich location.href mache, wird meine Anfrage verhindert.

function delete_item(){
    var containsID=reverseString($(location).attr('href')).split("/");
    var id = containsID[1];
    var xhr = new XMLHttpRequest();
    xhr.open('DELETE', '/buildings/' +id)
    xhr.send();
    //window.location.href = "/buildings";
}

Kann ich machen, dass location.href nur bei Erfolg ausgeführt wird?

Danke Uri

  1. Tach!

    Ich möchte einen AJAX-Request schicken und im Anschluss location.href machen.

        xhr.send();
        //window.location.href = "/buildings";
    

    Das ist ja auch nicht der Anschluss, jedenfalls nicht der, den du meinst.

    Kann ich machen, dass location.href nur bei Erfolg ausgeführt wird?

    Der Anschluss ist dann, wenn das Event onreadystatechange mit readyState 4 (DONE) aufgerufen wird. Und erfolgreich war der Aufruf, wenn der Status 200 ist.

    dedlfix.

    1. Hi, mal wieder einen riesen Dank 😉

      Es funktioniert jetzt:

      function delete_item(){
          var containsID=reverseString($(location).attr('href')).split("/");
          var id = containsID[1];
          var xhr = new XMLHttpRequest();
          xhr.open('DELETE', '/buildings/' +id);
          xhr.onreadystatechange = function(){
                  window.location.href = "/buildings";
          }
          xhr.send();
      }
      

      Gruß

      Uri

      1. Tach!

        Es funktioniert jetzt:

            xhr.onreadystatechange = function(){
                    window.location.href = "/buildings";
            }
        

        Nö, das ist es noch nicht. Dieses Ereignis kann unter Umständen mehrfach aufgerufen werden, und das auch bevor der Request erfolgreich beendet wurde. Deshalb gab ich da ja noch die Bedingungen an. readyState muss auf 4 stehen, dann ist der Reqest beendet. Wenn das der Fall ist, kannst du den status befragen, der bei Erfolg 200 ist, ansonsten 4xx oder 5xx ist, oder undefiniert, wenn es einen Netzwerkfehler und keine Response gab. Auf den readyState-Vergleich kann man zur Not verzichten und nur den status == 200 prüfen, aber dann muss man schon sehr optimistisch sein und hat für den Fehlerfall keine Reaktion.

        dedlfix.

        1. Hi, sieht jetzt so aus:

          function delete_item(){
              var containsID=reverseString($(location).attr('href')).split("/");
              var id = containsID[1];
              var xhr = new XMLHttpRequest();
              xhr.open('DELETE', '/buildings/' +id);
              xhr.onreadystatechange = function(){
                  if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
                      window.location.href = "/buildings";
                  }
                  if(xhr.readyState === XMLHttpRequest.DONE && xhr.status >= 400) {
                      console.log(xhr.status);
                  }
              }
              xhr.send();
          }
          

          Es scheint bisher zu funktionieren, wobei ich den Fehlerfall nicht getestet habe. Wie werden Fehler eigentlich vernünftig behandelt? Mal angenommen, ich bekomme 5xx habe ich doch keinerlei Gewissheit, ob meine db-query serverseitig tatsächlich funktioniert hat, oder sehe ich das falsch?

          Gruß Uri

          1. Tach!

            Es scheint bisher zu funktionieren, wobei ich den Fehlerfall nicht getestet habe.

            Sieht besser aus.

            Wie werden Fehler eigentlich vernünftig behandelt? Mal angenommen, ich bekomme 5xx habe ich doch keinerlei Gewissheit, ob meine db-query serverseitig tatsächlich funktioniert hat, oder sehe ich das falsch?

            Das siehst du schon richtig. Aber den 500er bekommst du üblicherweise, weil du ihn auf der Serverseite so zurückgibst. Warum auch immer dir bei der Verarbeitung etwas nicht gepasst hat, du musst da ja auch den Client irgendwie informieren in solch einem Fall. Ausnahmen wären Proxy-Fehler (auch Load-Balancer), die auch in den 500ern drin sind. Aber Proxy und Load-Balancer wirst du wohl nicht verwenden.

            Wie du auf Clientseite am besten reagierst, kann ich dir nicht sagen. Vermutlich wirst du da nur eine Fehlermeldung zeigen wollen. Es sei denn, du schickst mit dem 500er eine genauere Fehlermeldung zurück, die du dann clientseitig irgendwie passend behandelst. Im Allgemeinen wird es aber wohl serverseitig auf einen Eintrag in die Fehlerlogdatei hinauslaufen und allgemeine Tröstmeldung bei Client.

            dedlfix.

  2. Hi,

    kurz und knapp:

    xhr.onload = function(){
       if( xhr.status == 200 ){}
       else{}
    };
    

    Schönen Sonntag!