Approfondire le Promise

In questo video andremo ad analizzare in maniera più approfondita le Promise che abbiamo già introdotto nel video precedente (se non lo avete ancora fatto consiglio di guardare il video sez8/2 prima di questo).
In particolare, in questo video vedremo come si concatenano più Promise ("chaining" in inglese) in maniera da fare multiple richieste in serie al server. Fare chiamate in serie significa che dopo aver fatto una chiamata e ricevuta una risposta, faccio un'altra chiamata e poi ricevuta la risposta ne faccio un'altra e così via.
Poi andremo a parlare del metodo all(). Questo metodo consente di fare multiple richieste in parallelo al server. Fare chiamate in parallelo significa fare tutte le chiamate insieme, aspettare di ottenere tutte le risposte e poi proseguire con il resto del codice della Promise.
Normalmente si usano le richieste in serie quando una richiesta ha bisogno della risposta della richiesta precedente (ovviamente questo allunga i tempi di esecuzione del codice perché si deve attendere sempre la risposta precedente). Le chiamate in parallelo si usano quando non serve aspettare la risposta della chiamata precedente (questo permette di risparmiare tempo).
Infine parleremo del metodo race(). Questo metodo esegue una serie di richieste tutte insieme e aspetta finché non riceva la prima risposta (ignorando tutte le altre) e poi continua con il resto del codice. E' usato quando si vuole lavorare solo con la risposta più veloce.

Note al video: 

IMPORTANTE: coinmarketcap.com ha cambiato regole e ora le sue API sono disponibili solo per chi crea un account. Ho trovato un altro servizio con API pubbliche restcountries.eu, tutto il codice descritto nel video rimane lo stesso dovete solo cambiare l'Url a cui richiedere i dati. Il nuovo Url e': https://restcountries.eu/rest/v2/capital/london, potete cambiare il nome della citta' a vostro piacimento.

Trascrizione: (click per espandere)
salve a tutti in questo video parlerò
delle Promesi in maniera un po' più
approfondita e come si può usare più Promesi e concatenandole tra di loro
allora come vedete qui ho la mia stessa
funzione del video precedente e la
funzione carica file che ritorna una
Promesi e viene invocato da questa
funzione converti json che mi fa il
parsing dell'oggetto ricevuto e mi fa
output se c'è un errore mi viene
visualizzato qui l'unica differenza tra
questa funzione è quella del video
precedente è che nell'Url del server a
cui faccio la richiesta e qui ho
cancellato bitcoin e sto passandoci il
l'argomento coin che viene passato dalla
mia funzione e quando vado a invocare la
mia funzione carica file qui ci passò il
nome del coin perché sto facendo questo
perché voglio fare altri due chiamate a
due coin diverse
allora prima avevamo solo bitcoin adesso
vado a fare una chiamata per ethereum
e per ripple che sono le prime tre
che ci sono come vedete l'Url lo stesso
di bitcoin basta solo cambiare il nome
della coin alla fine quindi adesso il
ritorno sulla mia pagina vi faccio
vedere come si può concatenare più
Promesi
allora io sono qui con questa qui faccio
la chiamata per bitcoin qui creo un
ritorno dove vado a reinvocare la mia
funzione carica file e ci passo dentro
il nome ethereum
ecco qui e poi vado a copiare il metodo
then e lo concateno come vedete lo
concateno all'altro then anzi
facciamo così così viene anche un po' più
chiaro allora io qui ho
invoco la mia funzione se la mia
funzione ritorna un dati dal server bene
che i dati catturati vengono catturati
da questo then qui che mi fa il parsing
dell'oggetto e me lo visualizza poi
reinvoco la mia funzione e la ritorno in
maniera che se anche la seconda chiamata
per ethereum viene risolta mi viene
fatto il parsing mi vengono
visualizzati i dati e faccia la stessa
cosa anche per ripple quindi io qui
passano ripple e vado a concatenarci un
altro then ecco qui se anche il ripple
mi fa il fulfill della Promesi mi
verrà visualizzato qui se qualcosa va
male quindi c'è un errore durante queste
tre chiamate l'errore viene
catturato dal mio "catch" e visualizzato
nella console
quindi adesso io vado a salvare vediamo
e come vedete non mi sono arrivate tra
risposte la prima risposta è per bitcoin
la seconda risposta è per ethereum e la
terza risposta è per ripple in questa
maniera qui io ho fatto tre chiamate
usando la stessa funzione in maniera e
si dice in linea in serie cioè prima è
la prima chiamata se tutto va bene la
seconda chiamata se tutto va bene la
terza chiamata adesso vi facciamo vedere
come si possono fare tre chiamate
contemporaneamente in parallelo quando
io avrò la risposta di tutte e tre le
chiamate andrò a visualizzare i loro
risultati
se qualcosa va male come sempre viene
catturato dal mio catch allora vi faccio
vedere come si può fare allora commento
questo lo riscrivo qui allora facciamo
così il catch mi serve come facciamo
allora si usa Promesi.all e il
metodo all
il metodo all accetta un'array
eccolo qui anzi facciamo che cancelliamo qui
senno' facciamo confusione
allora il metodo "all" accetta un'array e
dentro questo array ci metto le tre
chiamate precedenti quindi la prima
chiamata era carica file per bitcoin
eccola qui la seconda chiamata era
carica file per ethereum
eccola qui la terza chiamata era carica
file per ripple ecco queste tre chiamate
i risultati di queste tre chiamatemi
verranno visualizzati come sotto forma
di elementi di un'array
quindi io qui ci metto un metodo den
eccolo qui che mi prende i dati eccolo
qui anzi è così abbiamo detto che dati
sarà un'array con i tre in cui tre
elementi sono le tre risposte quindi io
posso andare a fare la output adesso console.log dati elemento 0 e poi
faccio console.log dati elemento 1
questo sarà e questo e poi dati elementi
e quindi la risposta del primo
sarà il bitcoin perché occupa il primo
posto qui dentro il mio array qui e poi
avrò ethereum e poi avro' ripple se qualcosa va male in
queste tre chiamate viene catturata dal
mio catch quindi il primo abbiamo fatto
le chiamate in serie prima una poi
l'altra poi l'altra a mano a mano che
la
prima veniva risolta poi partiva la
seconda poi quando veniva risolta
partiva la terza in questo caso faccio
tutte e tre le chiamate
contemporaneamente e quando ho tutti e tre
gli elementi le risposte vengono visualizzate
se qualcosa va male ho il mio catch
salviamo ho scritto qualcosa sbagliato
53 ha sì ci va la virgola perché abbiamo
detto che è un array
ok eccole qui questi sono i tre miei
risultati bitcoin ethereum e ripple fatte
le chiamate contemporaneamente infatti
avete visto che velocità perché tutti e
tre sono partite allo stesso momento
adesso vi faccio vedere un'altra
maniera
per usare le Promesi però io faccio tre
chiamate contemporaneamente ma sono
interessato solo alla prima che mi vede
la prima di cui io ricevo risposta
quindi io uso sempre function converti
json eccola qui a cui ci passo dentro il
niente allora invece di usare
Promesi.all uso Promesi.race che vuol
dire gara la prima che arriva vince
eccola qui sempre un'array ecco qui
allora abbiamo detto faccio una chiamata
per bitcoin una chiamata per ethereum è una
chiamata per ripple poi io c'ho il mio
then che cattura la risposta la prima
risposta che mi viene è ritornata dal
server quindi risposta e andiamo a
vedere la sua risposta
facciamo console.log quindi la prima che
arriva vince altrimenti c'è il mio catch
se qualcosa va male viene
catturata dal mio catch e viene
visualizzata dal mio console.log del
catch e quindi ci metto error andiamo a
vedere chi vince ha vinto bitcoin però
non è detto che vinca sempre bitcoin
adesso proviamo a fare qualche
esperimento o questa volta video ethereum
questa volta ha rivinto i bitcoin questa
volta bitcoin ethereum sembra che ripple
sia un po' quello più sfortunato
comunque vedete ogni volta non è detto
che la prima risposta dal server vince
io faccio tre chiamate e la prima vince
vi ripeto sto usando coinmarketcap
questo sito qui perché c'ha le "API" che
sono pubbliche possono essere usate da
tutti
ci sono tanti altri siti in cui si
possono usare le "API" gratuitamente
però se ci si deve registrare altri siti
invece hanno le "API" a pagamento comunque
fate i vostri esperimenti con questo è
tutto ci sentiamo la prossima ciao
File del video: