Template designed by
Programmazione asincrona in
Javascript
Giorgio Di Nardo
g.dinardo@live.com
@akelitz
http://blogs.ugidotnet.org/akelitz/
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
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
demo
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

Programmazione asincrona in java script

  • 1.
    Template designed by Programmazioneasincrona in Javascript Giorgio Di Nardo g.dinardo@live.com @akelitz http://blogs.ugidotnet.org/akelitz/
  • 2.
    GIORGIO DI NARDO Lavoropresso Proge-software come Software Architect Sono tra i fondatori di DomusDotNet Mi interesso di Web Application e ALM chi sono
  • 3.
    Programmazione asincrona eCallback hell Promises Demo (Callback, jQuery, Q e ES6) agenda agile
  • 4.
  • 5.
    La programmazione sincronaè semplice e funziona, ma… Blocco del thread!
  • 6.
    Le callback risolvonoil problema del blocco del thread, ma…
  • 7.
    In una callbacknon ci sono return Nessuno può ricevere questo valore
  • 8.
    In una callbacknon ci sono throw Nessuno può intercettare questa eccezione
  • 9.
    Le callback nonoffrono alcuna garanzia
  • 10.
    … tranne quelladella Pyramid of Doom Questa è una via senza ritorno
  • 11.
    Tranquilli, le cosepossono sempre peggiorare
  • 12.
    A livello diresponsabilità come siamo messi?
  • 13.
  • 14.
    Diversa modalità digestione valori di ritorno Nessuna possibilità di propagare le eccezioni Scarse garanzie di standardizzazione Difficoltà di lettura del codice Violazione del Single Responsability Principal Ricapitolando
  • 15.
    «Lasciati sedurre dal latooscuro delle callback»
  • 16.
  • 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 Promiseinvertiamo la catena di responsabilità: invece di ricevere una funzione da chiamare, restituiamo un oggetto che notificherà il completamento.
  • 19.
    Le Promise fornisconouna solida astrazione per rappresentare lo stato di una chiamata asincrona e consentono di scrivere un flusso di operazioni basate su tale stato.
  • 20.
  • 21.
    Una Promise devefornire 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 unaPromise Pending Fulfilled value Rejected reason
  • 24.
  • 25.
    Firma del metodopiù leggibile Semantica uniforme tra return e error Composizione semplificata Sempre asincrona Propagazione degli errori Vantaggi delle Promise
  • 26.
  • 27.
    Ogni then() èun ramo indipendente
  • 28.
    La then() devepropagare il risultato Non stampa nulla
  • 29.
    Le eccezioni sipropagano in avanti e non all’indietro And the winner is…
  • 30.
    Le eccezioni devonoessere propagate esplicitamente And the winner is…
  • 31.
    Le Promise nonvengono mai risolte immediatamente È ancora 0
  • 32.
    In JavaScript abbiamoun 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