Articles

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.

(la promessa.ts)

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.

(tsconfig.json)

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 metodithencatch 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 thencatch o finally metodi per nessuna delle precedenti thencatch 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.

(promessa a catena.ts)

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

Ilresolvemetodo statico della chiamataPromiserestituisce 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.

(promessa di risolvere.ts)

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.

(la promessa di rifiuto.ts)

Il tipo di promessa restituita dal metodo Promise.rejectPromise<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.

(la promessa-tutti.ts)

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 classePromise 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.

(la promessa-tutti-rifiuta.ts)

Come puoi vedere dal risultato precedente, poiché la 3a promessa è stata rifiutata appena dopo 1 secondo, allPromise è stata rifiutata immediatamente.

Promessa.allSettled

IlPromise.allSettledmetodo statico è simile aPromise.allma 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).

(la promessa-tutti-permanente.ts)

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 diswitch/case protezione dei tipi e unioni discriminanti nella lezione del sistema dei tipi.

(la promessa-tutti-permanente.ts)

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.

(la promessa-gara.ts)

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 metodoPromise.any() ha raggiunto la fase 4 della traccia proposta ECMAScript. Promise.any è molto simile a Promise.race ma attende che la prima promessa abbia esito positivo. Questo metodo genera un’eccezioneAggregateError se tutte le promesse vengono rifiutate.