In un mondo "mobile-first cloud-first", in cui la qualità della connessione non può essere un assunto, per realizzare applicazioni web responsive è fondamentale liberare il thread della UI dal carico della risoluzione delle chiamate al back-end. Il paradigma asincrono consente di raggiungere questo risultato sia con l'approccio basato su callback, che attraverso il concetto di Promise, potendo oltretutto usufruire dell'utile supporto di librerie ad hoc come Q o delle nuove specifiche ES6.
2. GIORGIO DI NARDO
Lavoro presso Proge-software come Software Architect
Sono tra i fondatori di DomusDotNet
Mi interesso di Web Application e ALM
chi sono
14. Diversa modalità di gestione valori di ritorno
Nessuna possibilità di propagare le eccezioni
Scarse garanzie di standardizzazione
Difficoltà di lettura del codice
Violazione del Single Responsability Principal
Ricapitolando
17. Una Promise è un oggetto che
rappresenta un valore che potrebbe
non essere ancora disponibile, ma
che lo sarà prima o poi nel futuro.
18. Con le Promise invertiamo la catena
di responsabilità: invece di ricevere
una funzione da chiamare,
restituiamo un oggetto che
notificherà il completamento.
19. Le Promise forniscono una solida
astrazione per rappresentare lo stato
di una chiamata asincrona e
consentono di scrivere un flusso di
operazioni basate su tale stato.
21. Una Promise deve fornire un metodo then() attraverso il quale sia possibile
accedere al value o alla reason attuali o futuri.
Il metodo then() accetta due argomenti, le callback che saranno chiamate
rispettivamente quando la Promise viene risolta (passando in stato Fulfilled) o
rifiutata (passando in stato Rejected)
Ogni callback viene chiamata quando il value o la reason sono disponibili e in
ogni caso sempre e solo una volta
Value e reason sono immutabili
Sintassi e garanzie della Promise (1)
22. Il metodo then() della Promise deve restituire una nuova Promise:
• Se onFulfilled o onRejected ritornano un valore, allora la nuova promise
deve essere risolta (Fulfilled) con quel valore
• Se onFulfilled o onRejected lanciano un’eccezione, allora la nuova promise
deve essere rifiutata (Rejected) con quella motivazione
• Se la promise è stata risolta ma onFulfilled non è una funzione, allora la
nuova promise deve essere risolta con lo stesso valore della prima
• Se la promise è stata rifiutata ma onRejected non è una funzione, allora la
nuova promise deve essere rifiutata con lo stesso valore della prima
Sintassi e garanzie della Promise (2)
23. Stati di una Promise
Pending
Fulfilled
value
Rejected
reason
25. Firma del metodo più leggibile
Semantica uniforme tra return e error
Composizione semplificata
Sempre asincrona
Propagazione degli errori
Vantaggi delle Promise
31. Le Promise non vengono mai risolte immediatamente
È ancora 0
32. In JavaScript abbiamo un unico thread quindi non possiamo permetterci di
bloccarlo
La soluzione «semplice» è la programmazione asincrona usando le callback
La difficoltà di leggere il codice, di propagare le eccezioni, di concatenare le
chiamate, ci spinge a cercare soluzioni più robuste
Le Promise sono la risposta a questi problemi
Q è una libreria che supporta pienamente le specifiche Promises/A+ e
consente di scrivere codice asincrono molto semplicemente in attesa di ES6
Recap