Zuerst mal meine (momentan) favorisierte Bibliothek für Promises, dokumentiert hier: http://bluebirdjs.com/docs/api-reference.html
Promises sind quasi Futures von hinten aufgezäumt. Ein Promise ist ein Future, der entweder einen Erfolg inklusive Rückgabewert oder einen Misserfolg inklusive Fehler-Objekt (meist ein Stacktrace) liefert. Rufe ich also einen HTTP-GET-Request aus, kann dieser mir entweder das Dokument liefern oder einen Fehler.
Das Coole daran sind jetzt die Features, die ich damit habe:
- thenable ist das wichtigste Feature eines Promises. Ein Promise ist ein Promise, wenn es die then()-Funktion aufweist. In der then()-Funktion übergibt man 2 Callbacks: Success und Failure.
- Ruft man then auf, erhält man wiederum einen Future
- Ich kann in einem then-Callback Werte oder weitere Futures zurückgeben. Gebe ich einen Wert zurück, wird dieser als Erfolg für den then-Future in die nächste Kette gefüttert. Gebe ich einen Future zurück, wird dieser als nächstes ausgeführt.
- Ich kann auf ein Array von Futures warten und bekomme ein Array von Werten
- Ich kann beliebig eigene Promises kreieren und muss lediglich dafür sorgen, dass entweder resolve() oder reject() aufgerufen wird.
- Durch das Verketten von Promises (.then() returnt einen Anschluss-Promise) wird aus 100 Verschachtelungen auf einmal 100 verkettete .then()s
- So langsam setzt sich durch, dass beliebige APIs auf einmal statt normalen Werten auch Promises entgegennehmen. Man muss Werte also gar nicht mehr auswerten, sondern übergibt lediglich Futures darauf.
- Es gibt so eine hübsche Funktion .promisifyAll, die wandelt die komplette node.js-API in Promise-enabled Funktionen um.
- Mit JS-Coroutinen kann man auf einmal sequenziellen Code schreiben, der asynchron ausgeführt wird. Das sieht dann so aus:
Code: Alles auswählen
var myFunction = Promise.coroutine(function* (keyword) {
wikipediaPage = yield $http.get('https://de.wikipedia.org/wiki/' + keyword);
// tue irgendwas mit wikipediaPage
});
myFunction('JavaScript');
Ich wollte eigentlich mal eine Programmiersprache entwickeln, die genau so mit Futures umgeht, aber jetzt kann es auf einmal JavaScript frei haus.