Programmazione asincrona in java script

Post on 17-Aug-2015

24 views 0 download

transcript

Template designed by

Programmazione asincrona in Javascript

Giorgio Di Nardog.dinardo@live.com@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