Asynchrones Programmieren in JavaScript

Asynchrones Programmieren in JavaScript (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

JavaScript ist eine Singlethreadsprache. Das bedeutet, dass beim Aufrufen eines lange ausgeführten Prozesses die gesamte Ausführung blockiert wird, bis dieser Prozess abgeschlossen ist UI-Elemente reagieren nicht, Animationen werden angehalten, und es kann kein anderer Code in der App ausgeführt werden. Die Lösung dieses Problems besteht darin, die synchrone Ausführung so häufig wie möglich zu vermeiden.

Eine Möglichkeit hierfür ist das Ausführen einer Funktion zu einem späteren Zeitpunkt wie bei Ereignishandlern, die aufgerufen werden, nachdem ein anderer Aufruf ein Ereignis ausgelöst hat. Rückruffunktionen stellen eine andere Art der asynchronen Verarbeitung dar, da sie Rückrufe in den Code vornehmen, von dem der Prozess initiiert wurde.

Probleme beim Verwenden der asynchronen Programmierung

Die asynchrone Programmierung kann schnell kompliziert werden. Viele der standardmäßigen JavaScript-APIs sind stark von Rückrufen abhängig, die oft geschachtelt sind und somit das Debuggen erschweren. Außerdem kann das Lesen des Rückrufstapels durch die Verwendung anonymer Inlinefunktionen problematisch werden. Ausnahmen, die in einem stark geschachtelten Satz von Rückrufen ausgelöst werden, werden möglicherweise nicht bis zu einer Funktion verteilt, von der die Kette initiiert wurde. Dadurch ist es schwer, genau zu bestimmen, wo ein Fehler verborgen ist.

Asynchrone Programmierung in Windows-Runtime-Apps mit JavaScript

Die Windows-Runtime und Windows-Bibliothek für JavaScript bieten durch Implementieren des Vorschlags Common JS Promises/A eine Möglichkeit, diese Probleme zu überwinden. Ein Zusageobjekt gibt zu einem Zeitpunkt in der Zukunft einen Wert zurück. Mit diesen Objekten können Sie Ketten von asynchronem Code erstellen, die leichter zu lesen sind.

Alle Windows-Runtime-APIs, die für Windows Store-Apps verfügbar gemacht werden, sind in Zusageobjekte eingeschlossen. Dadurch können Sie Windows-Runtime-APIs auf eine für Sie bequeme Weise verwenden. Die Zusagen in WinJS sind wichtig, da viele Interaktionen mit der Windows-Runtime asynchron sind.

Erläutern von Zusagen

Eine Zusage ist ein Objekt. Die am häufigsten für ein Zusageobjekt verwendete Methode lautet then, und sie besitzt drei Parameter: eine Funktion, die beim erfolgreichen Abschließen der Zusage aufgerufen wird, eine Funktion, die beim Abschließen der Zusage mit einem Fehler aufgerufen wird, und eine Funktion, die Statusinformationen bietet. Sie können in der Windows-Runtime und WinJS auch die done-Funktion verwenden, die dieselben Parameter besitzt. Der Unterschied besteht darin, dass die then-Funktion im Falle eines Fehlers bei der Verarbeitung eine Zusage im Fehlerstatus zurückgibt, aber keine Ausnahme auslöst, während die done-Methode eine Ausnahme auslöst, wenn keine Fehlerfunktion bereitgestellt wurde.

Sehen wir uns ein grundlegendes Beispiel für eine Zusage mit zwei (erfundenen) asynchronen Methoden – eine zum Aufrufen eines Webdiensts und eine andere zum Speichern von Ergebnissen in einer Datenbank – an.


myWebService.get("http://www.example.com")
    .then(function(result) { 
        return myDb.add(result); 
    })
    .then(function() {
        console.log('data successfully saved');
    }, function(error) {
        console.log('an error occurred while saving:');
        console.dir(error);
    });


Sie fügen die then-Funktion an die myWebService.get-Methode an. Da diese Methode eine Zusage zurückgibt, können Sie eine zweite then-Funktion an die myDb.add-Methode anfügen und alle Fehler in der Fehlerfunktion beheben, die Sie an die zweite then-Funktion übergeben.

Sie können auch mehrere Zusagen gruppieren. Sie können beispielsweise mit der join-Funktion mehrere asynchrone Vorgänge ausführen, die verschiedene Webdienste ausführen, und dann die Ergebnisse aggregieren.


function loadData() {
    var urls = [
        'http://www.example.com/',
        'http://www.example.org/',
        'http://www.example.net'
        ];
        
    var promises = urls.map(function (url) {
        return myWebService.get(url);
    });

    WinJS.Promise.join(promises).then(function () {
        //do the aggregation here.
    });
}


Zuerst erstellen wir ein Array mit URLs. Dann verwenden wir die Array.map-Funktion, um das Array mit URLs in ein Array mit Zusagen zu konvertieren (da mywebService.get eine Zusage zurückgibt). Abschließend verwenden wir die join-Funktion, die ein Array mit Zusagen annimmt und eine neue Zusage zurückgibt, nachdem alle Zusagen abgeschlossen wurden. Wir nehmen die Datenaggregation innerhalb der vollständigen Funktion der then-Methode vor.

Verwandte Themen

Schnellstart: Verwenden von Zusagen
Behandeln von Fehlern mit Zusagen
Problembehandlung bei WinRT-Fehlern
Verketten von Zusagen
Behandeln mehrerer Zusagen

 

 

Anzeigen:
© 2016 Microsoft