Una rapida introduzione a “Promises” e “Async/Await” (con nuove funzionalità)
Una promise è un’istanza (oggetto) della classe Promise
(costruttore). Per creare una promessa, usiamo la sintassinew Promise(executor)
e forniamo una funzione executor come argomento. Questa funzione executor fornisce un mezzo per controllare il comportamento della nostra risoluzione promessa o rifiuto.
In TypeScript, possiamo fornire il tipo di dati del valore restituito quando la promessa viene eseguita. Poiché l’errore restituito dalla promessa può assumere qualsiasi forma, il tipo di dati predefinito di valore restituito quando la promessa viene rifiutata è impostato su any
dal dattiloscritto.
Per annotare il tipo di valore di risoluzione della promessa, usiamo una dichiarazione di tipo generico. Fondamentalmente, prometti un tipo con Promise
costruttore sotto forma di new Promise<Type>()
che indica il tipo di valore risolto della promessa. Ma puoi anche usare la sintassilet p: Promise<Type> = new Promise()
per ottenere lo stesso.
have Abbiamo discusso in dettaglio le lezioni sui generici nella lezione sui generici.
Nell’esempio precedente, findEven
è una promessa creata utilizzando il costruttore Promise
che si risolve dopo 1 secondo. Il tipo di dati risolto di questa promessa ènumber
, quindi il compilatore TypeScript non ti permetterà di chiamare la funzioneresolve
con un valore diverso da un valore di tipo numbernumber
.
Il tipo predefinito del valore di rifiuto della promessa èany
, quindi chiamare la funzionereject
con qualsiasi valore è legale. Questo è il comportamento predefinito di TypeScript e puoi trovare il thread di discussione qui se hai le tue opinioni.
Poiché abbiamo fornito il number
come tipo di dati di risoluzione promessa riuscita, il compilatore TypeScript fornirà il number
tipo all’argomento di value
argomento del then
metodo di callback.
Il callback fornito nel metodo then
viene eseguito quando la promessa viene risolta e il callback fornito nel metodo catch
viene eseguito quando rifiuta o qualche errore durante la risoluzione della promessa. Il metodofinally
registra un callback che viene eseguito quando promise risolve o rifiuta.
Se il compilatore TypeScript si lamenta del metodo finally
, significa che il compilatore TypeScript non importa le definizioni dei tipi per il metodo finally
. Questo metodo è stato introdotto in ES2016, quindi è abbastanza nuovo. Altre funzionalità dell’API Promise utilizzate in questa lezione sono piuttosto nuove, quindi assicurati che il tuo filetsconfig.json
abbia tutte le nuove librerie caricate.
Nel miotsconfig.json
, ho caricato la libreria standardES2020
. Questo fornisce il supporto per tutte le funzionalità JavaScript fino a ES2020. Se vuoi saperne di più sul file tsconfig.json
o sulle librerie standard, leggi la lezione di compilazione (in arrivo).
Concatenamento delle promesse
I metodithen
catch
efinally
restituiscono implicitamente una promessa. Qualsiasi valore restituito da queste funzioni di callback viene avvolto con una promessa e restituito, inclusoundefined
. Questa promessa implicita viene risolta per impostazione predefinita a meno che non si restituisca deliberatamente una nuova promessa da questi metodi che potrebbe fallire.
Quindi, è possibile aggiungere then
catch
o finally
metodi per nessuna delle precedenti then
catch
o finally
metodo. Se una promessa implicita viene restituita da uno di questi metodi, il tipo di valore risolto di questa promessa implicita è il tipo del valore restituito. Vediamo un rapido esempio.
Abbiamo modificato l’esempio precedente e aggiunto un altro metodo then
al primo metodo then
. Poiché il primo metodothen
restituisce un valore di tipostring
, la promessa implicita restituita da questo metodo verrà risolta con un valore del tipostring
. Quindi, il secondo metodo then
riceverà value
argomento di tipo string
come puoi vedere dai risultati.
Promessa.resolve
Ilresolve
metodo statico della chiamataPromise
restituisce una promessa già risolta correttamente con un valore fornito nella chiamataPromise.resolve(value)
. Questo è più semplice che creare una nuova istanza della chiamata Promise e aggiungere la logica per risolvere immediatamente la promessa.
Come si può vedere dai risultati di cui sopra, la promessa restituito da Promise.resolve(value)
chiamare sempre si risolve immediatamente con un number
in quanto value
argomento è il tipo di number
.
Promessa.reject
Simile al metodo staticoPromise.resolve
, il metodoPromise.reject(error)
restituisce sempre una promessa rifiutata. Il valore del rifiuto della promessa è preso dall’argomentoerror
e il suo tipo èany
.
Il tipo di promessa restituita dal metodo Promise.reject
Promise<never>
perché questa promessa non si risolve mai, quindi non ci sarà alcun valore di risoluzione della promessa. Pertanto il tipo di valore risolto dalla promessa ènever
poichénever
indica il valore che non si verifica mai.
Promessa.all
In alcuni scenari, hai a che fare con più promesse. Se si desidera eseguire una funzione di callback quando tutte le promesse vengono risolte correttamente, utilizzare il metodo staticoPromise.all
.
var pAll = Promise.all()pAll.then( ( ) => {___});
Il metodoPromise.all
accetta un array (iterabile con precisione) di promesse e restituisce una nuova promessa. La promessa restituitapAll
viene risolta quando tutte le promessep1, p2, ...
vengono risolte correttamente. Questa promessa viene risolta con un valore di matrice che contiene i valori di risoluzione della promessa dip1, p2, ...
nell’ordine del loro aspetto.
Come si può vedere dall’esempio precedente, Promise.all
metodo è generico e prende il tipo il valore risolto da ogni promessa fornita ad esso. Fornire un tipo generico è abbastanza utile quando stiamo usando il valore risolto di questa promessa collettiva come puoi vedere dal risultato sopra.
Most la maggior parte dei metodi statici della classe
Promise
sono generici come dimostrato negli esempi seguenti.
C’è un avvertimento conPromise.all
. Implementa il meccanismo fail-fast che significa che se una qualsiasi delle promesse di inputp1, p2, ...
viene rifiutata,pAll
viene rifiutata. If non aspetterà altre promesse in sospeso da risolvere.
Come puoi vedere dal risultato precedente, poiché la 3a promessa è stata rifiutata appena dopo 1 secondo, allPromise
è stata rifiutata immediatamente.
Promessa.allSettled
IlPromise.allSettled
metodo statico è simile aPromise.all
ma a differenza diPromise.all
, attende che tutte le promesse siano risolte (il che significa che fino a quando non vengono risolte o rifiutate). Quindi la promessa restituita da Promise.allSettled
non verrà mai rifiutata (ma abbiamo aggiunto comunque il blocco catch
nell’esempio seguente).
Lavorare con promise.allSettled
può essere un po ‘ opprimente come puoi dal programma sopra e dal suo risultato. Prima di tutto, il metodoallSettle
restituisce una promessa che si risolve con un array di valoriPromiseSettledResult<type>
quando tutte le promesse sono risolte. type
deriva dal tipo di promessa di input. Il tipoPromiseSettledResult
appare come di seguito.
Questi tipi sono forniti dalla libreria standard di TypeScript. Quindi, quando una promessa si risolve, il metodoallSettled
converte il suo valore inPromiseFulfilledResult
shape e quando fallisce, lo converte inPromiseRejectedResult
shape. Ecco perché quando allSettled
è risolto, è una matrice di oggetti in cui ogni oggetto ha una forma di PromiseFulfilledResult
o PromiseRejectedResult
interfaccia.
Dal PromiseFulfilledResult
è un unione di PromiseFulfilledResult
e PromiseRejectedResult
che ha common status
proprietà del dato letterale, si può usare come discriminante nel switch/case
guardia.
have Abbiamo parlato di
switch/case
protezione dei tipi e unioni discriminanti nella lezione del sistema dei tipi.
Promessa.race
IlPromise.race
prende un array (iterabile appunto) di promesse e restituisce una nuova promessa che risolve o rifiuta non appena una delle promesse di input si risolve o rifiuta. In altre parole, la promessa restituita da Promise.race
viene risolta con il risultato di una delle promesse di input che si deposita rapidamente.
A differenza di Promise.all
o Promise.allSettled
, questo metodo restituisce solo un singolo valore della prima promessa risolta, quindi il tipo della promessa restituita è Promise<number>
nel caso precedente. Poiché la 1a promessa è stata risolta per prima tra le altre, ilthen
callback difastestPromise
viene chiamato dopo 500 ms con il valore della promessa risolta.
The Il nuovo metodo
Promise.any()
ha raggiunto la fase 4 della traccia proposta ECMAScript.Promise.any
è molto simile aPromise.race
ma attende che la prima promessa abbia esito positivo. Questo metodo genera un’eccezioneAggregateError
se tutte le promesse vengono rifiutate.