Introduzione
Le promesse JavaScript possono essere difficili da comprendere. Pertanto, vorrei scrivere il modo in cui capisco le promesse.
Capire le Promesse
Una Promessa in breve:
“Immagina di essere un bambino. Tua mamma promette che ti regalerà un nuovo telefono la prossima settimana.”
Non sai se otterrai quel telefono fino alla prossima settimana. Tua mamma potrebbe davvero comprare un telefono nuovo di zecca, oppure non lo fa.
Questa è una promessa. Una promessa ha tre stati. Sono:
- In sospeso: Non sai se otterrai quel telefono
- Soddisfatta: Mamma è felice, ti compra un telefono nuovo di zecca
- Rifiutata: Mamma è infelice, non ti compra un telefono
Creare una Promessa
Convertiamo questo in JavaScript.
Il codice è abbastanza espressivo di per sé.
Ecco come normalmente appare la sintassi di una promise:
Utilizzare le Promises
Ora che abbiamo la promise, consumiamola:
Eseguiamo l’esempio e vediamo il risultato!
Demo: https://jsbin.com/nifocu/1/edit?js,console
Concatenazione di Promesse
Le promesse sono concatenabili.
Diciamo che tu, il bambino, prometti al tuo amico che gli mostrerai il nuovo telefono quando tua mamma te ne compra uno.
Questa è un’altra promessa. Scriviamola!
Note: Possiamo accorciare il codice precedente scrivendo come di seguito:
Concateniamo le promesse. Tu, il bambino, puoi iniziare la promessa showOff
solo dopo la promessa willIGetNewPhone
.
È così che puoi concatenare la promessa.
Le promesse sono asincrone
Le promesse sono asincrone. Registriamo un messaggio prima e dopo aver chiamato la promessa.
Qual è la sequenza di output attesa? Potresti aspettarti:
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
Tuttavia, la sequenza di output effettiva è:
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
Non ti fermeresti mentre aspetti la promessa di tua mamma (il nuovo telefono). Questo è qualcosa che chiamiamo asincrono: il codice verrà eseguito senza bloccare o attendere il risultato. Tutto ciò che deve aspettare che una promessa proceda viene messo in .then
.
Ecco l’esempio completo in ES5:
Promises in ES5, ES6/2015, ES7/Next
ES5 – Maggioranza dei browser
Il codice demo è funzionante in ambienti ES5 (tutti i principali browser + NodeJs) se includi la libreria promise Bluebird. Questo perché ES5 non supporta le promises di default. Un’altra famosa libreria promise è Q di Kris Kowal.
ES6 / ES2015 – Browser moderni, NodeJs v6
Il codice demo funziona subito perché ES6 supporta nativamente le promesse. Inoltre, con le funzioni ES6, possiamo ulteriormente semplificare il codice con una funzione freccia e utilizzare const
e let
.
Ecco l’esempio completo in codice ES6:
Nota che tutti i var
sono sostituiti con const
. Tutti i function(resolve, reject)
sono stati semplificati in (resolve, reject) =>
. Queste modifiche portano alcuni benefici.
ES7 – Async/Await
ES7 ha introdotto la sintassi async
e await
. Rende la sintassi asincrona più facile da comprendere, senza i .then
e .catch
.
Riscriviamo il nostro esempio con la sintassi ES7:
Promesse e Quando Utilizzarle
Perché abbiamo bisogno delle promesse? Come appariva il mondo prima delle promesse? Prima di rispondere a queste domande, torniamo ai fondamentali.
Funzione Normale VS Funzione Asincrona
Diamo un’occhiata a questi due esempi. Entrambi gli esempi eseguono l’addizione di due numeri: uno utilizza funzioni normali, l’altro aggiunge in remoto.
Funzione Normale per Aggiungere Due Numeri
Funzione Asincrona per Aggiungere Due Numeri
Se aggiungi i numeri con la funzione normale, ottieni il risultato immediatamente. Tuttavia, quando effettui una chiamata remota per ottenere il risultato, devi aspettare e non puoi ottenere il risultato immediatamente.
Non sai se otterrai il risultato perché il server potrebbe essere down, lento nella risposta, ecc. Non vuoi che l’intero processo sia bloccato mentre aspetti il risultato.
Chiamare API, scaricare file e leggere file sono alcune delle operazioni asincrone usuali che eseguirai.
Non è necessario utilizzare le promesse per una chiamata asincrona. Prima delle promesse, utilizzavamo i callback. I callback sono una funzione che chiami quando ottieni il risultato di ritorno. Modifichiamo l’esempio precedente per accettare un callback.
Azione Asincrona Successiva
Invece di aggiungere i numeri uno alla volta, vogliamo aggiungere tre volte. In una funzione normale, lo faremmo:-
Ecco come appare con i callback:
Demo: https://jsbin.com/barimo/edit?html,js,console
Questa sintassi è meno user-friendly a causa dei callback annidati in profondità.
Evitare Callbacks Annidati in Profondità
Le Promises possono aiutarti a evitare i callback annidati in profondità. Diamo un’occhiata alla versione con Promises dello stesso esempio:
Con le promesse, appiattiamo il callback con .then
. In un certo senso, sembra più pulito perché non c’è nidificazione di callback. Con la sintassi async
di ES7, potresti migliorare ulteriormente questo esempio.
Observables
Prima di decidere per le promesse, c’è qualcosa che è emerso per aiutarti a gestire i dati asincroni chiamato Observables
.
Diamo un’occhiata allo stesso demo scritto con Observables. In questo esempio, utilizzeremo RxJS per gli observables.
Gli Observables possono fare cose più interessanti. Ad esempio, delay
aggiungere la funzione di 3 secondi
con una sola riga di codice o riprovare in modo da poter riprovare una chiamata un certo numero di volte.
Potresti leggere uno dei miei post su RxJs qui.
Conclusione
Familiarizzare con callback e promesse è importante. Comprendili e utilizzali. Non preoccuparti ancora degli Observable. Tutti e tre possono influenzare il tuo sviluppo a seconda della situazione.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises