Trappole comuni delle Promesse
Evitare gli errori comuni
Le promise non funzionano come gli altri valori
Non puoi stamparne il valore come faresti con la maggior parte dei valori:
// Questo non ha senso con le promise:
console.log(Promise.resolve(42));
// Dobbiamo utilizzare l'interfaccia `.then`:
Promise.resolve(42).then(value => console.log(value));
Le promise non ti avvertono quando commetti un errore
Beh, un errore probabile.
Per diversi motivi, il comitato TC39 ha deciso che .then e .catch possono ricevere null. Per esempio, .then(null, null) è valido e il comportamento richiesto è saltare quel “passo” nella catena.
La conseguenza spiacevole di questa decisione è che è molto facile combinare pasticci.
Per esempio
Consideriamo una piccola sfida: quale/i delle seguenti opzioni eseguirà/no console.log per stampare 42?
// Opzione #1:
Promise.resolve(42).then(console.log());
// Opzione #2:
Promise.resolve(42).then(console.log);
// Opzione #3:
Promise.resolve(42).then(value => console.log(value));
// Opzione #4:
Promise.resolve(42)
.then(console.log())
.then(console.log);
La risposta
La risposta è #2, #3 e #4.
Perché? Analizziamo i tipi degli argomenti passati a .then():
var arg1 = console.log();
var arg2 = console.log;
var arg3 = value => console.log(value);
typeof arg1 === "undefined";
typeof arg2 === "function";
typeof arg3 === "function";
Ancora curioso di sapere come funziona la quarta opzione?
Funziona effettivamente così:
// Opzione #4 - in pratica
Promise.resolve(42)
.then(undefined) // non ha alcun effetto sul valore, verrà passato al `.then(fn)` successivo
.then(console.log);