Promise‑Fallen
Vermeidung häufiger Fehler
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 KernPromise.resolve(42) .then(undefined) // hat keinen Einfluss auf den Wert, er wird an das nachfolgende `.then(fn)` weitergereicht .then(console.log);