Reinhard: Ajax Method Chaining

Hallo zusammen,

ich probiere immer mal wieder was neues mit JavaScript aus; gestern wollte ich folgendes hinkriegen:
Ich habe eine Funktion, in der ich mit Ajax eine Datei einlesen und das Resultat anschließend zurückgeben möchte, um es dann – ganz im jQuery-Style – weiterverarbeiten zu können. So ungefähr:

var ajax = function(url, settings) {
    var async = (typeof settings.async === 'undefined') ? true : settings.async;
    var xhr = new XMLHttpRequest();
    xhr.overrideMimeType('text/plain; charset=UTF-8');
    xhr.onreadystatechange = function() {
        if (xhr.readyState !== 4)
          return;
        if (xhr.status === 200)
          settings.success.call(xhr, xhr);
         else
          settings.error.call(xhr, xhr);
    };
    xhr.open('GET', url + '?nocache=' + new Date().getTime(), async);
    xhr.send(null);
};
function ersteZeile(url) {
    ajax(url, {
        success: function(xhr) {
            // yay, alles okay
            // return xhr.responseText.split('\n')[0];
        },
        error: function(xhr) {
            // ups, fehler
            // return '';
        }
    });
}

var z = ersteZeile('meineTextdatei.txt').substr(0, 5);

Natürlich geht das ja nicht so einfach. Man müsste den Ajax-Request synchron erledigen; also so:

function ersteZeile(url) {
    var zeile;
    ajax(url, {
        async: false,
        success: function(xhr) {
            // yay, alles okay
            zeile = xhr.responseText.split('\n')[0];
        },
        error: function(xhr) {
            // ups, fehler
            zeile = '';
        }
    });
    return zeile;
}

So, und an dieser Stelle möchte ich mal die Experten fragen: Gibt es da eine andere, bessere™ Möglichkeit? Synchrones Ajax ist ja nicht so der Hit, wie ich gehört habe. Ich habe mal in Richtung »Promise« geschaut, aber soweit ich das nach ein paar mal durchlesen beurteilen kann ginge das Chaining damit auch nicht.

Reinhard

  1. Tach!

    So, und an dieser Stelle möchte ich mal die Experten fragen: Gibt es da eine andere, bessere™ Möglichkeit? Synchrones Ajax ist ja nicht so der Hit, wie ich gehört habe. Ich habe mal in Richtung »Promise« geschaut, aber soweit ich das nach ein paar mal durchlesen beurteilen kann ginge das Chaining damit auch nicht.

    Richtig, asynchrones Chaining geht nach meinem Dafürhalten überhaupt nicht. Asynchrones Arbeiten und damit auch Promises verlangen eine Funktion übergeben zu bekommen, die man nachher aufrufen kann. Chaining ist aber eine Direkt-Nacheinander-Ausführung. Man kann aber die Promises selbst chainen. Suchen nach "promise chaining" findet einige Vorgehensweisen.

    dedlfix.

  2. @@Reinhard

    Synchrones Ajax ist ja nicht so der Hit

    Auf der Hitliste der Oxymora könnte synchrones asynchrones JS & XML schon weit oben stehen.

    LLAP 🖖

    --
    „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
    „Hat auf dem Forum herumgelungert …“
    (Wachen in Asterix 36: Der Papyrus des Cäsar)
    1. Tach!

      Synchrones Ajax ist ja nicht so der Hit

      Auf der Hitliste der Oxymora könnte synchrones asynchrones JS & XML schon weit oben stehen.

      Das verbieten unsere allgemeinen AGB-Bedingungen.

      Abgesehen davon ist das nicht wirklich witzig. Die Verwendung vom XHR geht nun mal synchron und asynchron. Warum sich da der Erfinder der Abkürzung AJAX dabei nur auf die asynchrone Arbeitsweise und nur XML beschränkt hat, liegt zwar nahe, trotzdem hat sich der Begriff für die ganze Bandbreite des Einsatzes von XHR durchgesetzt. Dagegen anzukämpfen bringt so viel, wie bei Sturm in die entgegengesetzte Richtung zu blasen, um ihn eindämmen zu wollen. Man kann seine Kraft auch für wichtige Schauplätze verwenden. Nimm das Wort Ajax als das Wort an, wie es heute Verwendung findet und lass in der Schublade der Historie verschwinden, dass das mal eine Abkürzung war.

      dedlfix.

      1. @@dedlfix

        Nimm das Wort Ajax als das Wort an, wie es heute Verwendung findet

        Du meinst so wie nicht-reguläre reguläre Ausdrücke? ;-)

        LLAP 🖖

        --
        „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
        „Hat auf dem Forum herumgelungert …“
        (Wachen in Asterix 36: Der Papyrus des Cäsar)
        1. Hallo,

          Du meinst so wie nicht-reguläre reguläre Ausdrücke? ;-)

          Frage: Was sind guläre Ausdrücke?
          Antwort: Die sind irre!

          Gruß
          Kalk