DanLevy.net

Promise‑Fallen

Vermeidung häufiger Fehler

Hero image for Promise‑Fallen

Promises funktionieren nicht wie andere Werte

Man kann ihren Wert nicht wie die meisten Werte ausgeben:

// Das ergibt keinen Sinn bei Promises:
console.log(Promise.resolve(42));
// Wir müssen die `.then`‑Schnittstelle benutzen:
Promise.resolve(42).then(value => console.log(value));

Promises warnen nicht, wenn man einen Fehler macht

Nun, ein typischer Fehler.

Aus verschiedenen Gründen hat TC39 beschlossen, dass .then und .catch null akzeptieren dürfen. Zum Beispiel ist .then(null, null) gültig, und das erwartete Verhalten ist, diesen „Schritt“ in der Kette zu überspringen.

Die unglückliche Konsequenz daraus ist, dass man leicht Fehler einbauen kann.

Nach Beispiel

Betrachten wir eine Mini‑Aufgabe: Welche der folgenden Optionen gibt console.log 42 aus?

// Option #1:
Promise.resolve(42).then(console.log());
// Option #2:
Promise.resolve(42).then(console.log);
// Option #3:
Promise.resolve(42).then(value => console.log(value));
// Option #4:
Promise.resolve(42)
.then(console.log())
.then(console.log);
Die Antwort

Die Antwort lautet #2, #3 und #4.

Warum? Schauen wir uns die Typen der an .then() übergebenen Werte an:

var arg1 = console.log();
var arg2 = console.log;
var arg3 = value => console.log(value);
typeof arg1 === "undefined";
typeof arg2 === "function";
typeof arg3 === "function";

Noch Fragen, wie die vierte Option funktioniert?

Es läuft im Wesentlichen so:

// Option #4 - im Kern
Promise.resolve(42)
.then(undefined) // hat keinen Einfluss auf den Wert, er wird an das nachfolgende `.then(fn)` weitergereicht
.then(console.log);