Programmazione asincrona in java script
-
Upload
dotnetcampus -
Category
Education
-
view
24 -
download
0
Transcript of Programmazione asincrona in java script
Template designed by
Programmazione asincrona in Javascript
Giorgio Di [email protected]@akelitzhttp://blogs.ugidotnet.org/akelitz/
GIORGIO DI NARDOLavoro presso Proge-software come Software Architect
Sono tra i fondatori di DomusDotNet
Mi interesso di Web Application e ALM
chi sono
Programmazione asincrona e Callback hell
Promises
Demo (Callback, jQuery, Q e ES6)
agenda agile
Programmazione asincrona e Callback hell
La programmazione sincrona è semplice e funziona, ma…
Blocco del thread!
Le callback risolvono il problema del blocco del thread, ma…
In una callback non ci sono return
Nessuno può ricevere questo valore
In una callback non ci sono throw
Nessuno può intercettare questa eccezione
Le callback non offrono alcuna garanzia
… tranne quella della Pyramid of Doom
Questa è una via senza ritorno
Tranquilli, le cose possono sempre peggiorare
A livello di responsabilità come siamo messi?
Dalla padella nella brace…
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
«Lasciati sedurre dal lato oscuro
delle callback»
Promises
Una Promise è un oggetto che rappresenta un valore che
potrebbe non essere ancora disponibile, ma che lo sarà
prima o poi nel futuro.
Con le Promise invertiamo la catena di responsabilità:
invece di ricevere una funzione da chiamare, restituiamo un
oggetto che notificherà il completamento.
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.
Specifiche Promises/A+
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)
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)
Stati di una Promise
Pending
Fulfilled
value
Rejected
reason
dem
o Callback, jQuery, Q &
ES6
Firma del metodo più leggibile
Semantica uniforme tra return e error
Composizione semplificata
Sempre asincrona
Propagazione degli errori
Vantaggi delle Promise
«Perché non me l’hai detto
Ben!»
Ogni then() è un ramo indipendente
La then() deve propagare il risultato
Non stampa nulla
Le eccezioni si propagano in avanti e non all’indietro
And the winner is…
Le eccezioni devono essere propagate esplicitamente
And the winner is…
Le Promise non vengono mai risolte immediatamente
È ancora 0
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