Una Promise rappresenta il completamento futuro (o il fallimento) di un'operazione asincrona e il valore risultante.
Stati di una Promise
Una Promise si trova sempre in uno dei seguenti tre stati mutuamente esclusivi:
- pending (in attesa): Stato iniziale, ne completata ne rifiutata.
- fulfilled (risolta): Operazione completata con successo (
resolve(valore)). - rejected (rifiutata): Operazione fallita con errore (
reject(errore)).
Costruttore e Concatenazione di Base
const loadUser = (id) => {
return new Promise((resolve, reject) => {
fetch(`/api/users/${id}`)
.then((res) => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then((data) => resolve(data))
.catch((err) => reject(err));
});
};
loadUser(42)
.then((user) => console.log('Caricato con successo:', user.name))
.catch((err) => console.error('Error:', err.message))
.finally(() => console.log('Richiesta conclusa'));
Metodi Statici di Risoluzione
// Promise risolta immediatamente
const p1 = Promise.resolve('Immediate value');
// Promise rifiutata immediatamente
const p2 = Promise.reject(new Error('Immediate failure'));
Combinatori di Promise
| Metodo | Comportamento | Fallisce Quando |
|---|---|---|
Promise.all([p1, p2]) |
Attende che tutte le promise siano risolte | Qualsiasi promise viene rifiutata (interruzione immediata) |
Promise.allSettled([p1, p2]) |
Attende che tutte le promise siano concluse | Non fallisce mai |
Promise.race([p1, p2]) |
Assume l'esito della prima promise che conclude | La prima promise conclusa viene rifiutata |
Promise.any([p1, p2]) |
Si risolve con la prima promise completata con successo | Tutte le promise vengono rifiutate (AggregateError) |
// Promise.all: Attende piu richieste indipendenti in parallelo
const [users, posts] = await Promise.all([
fetchUsers(),
fetchPosts()
]);
// Promise.allSettled: Controlla lo stato di tutte le richieste
const results = await Promise.allSettled([reqA(), reqB()]);
results.forEach((res) => {
if (res.status === 'fulfilled') console.log('Value:', res.value);
else console.error('Reason:', res.reason);
});
Modello Equivalente con Async / Await
async function getUserData(id) {
try {
const res = await fetch(`/api/users/${id}`);
const data = await res.json();
return data;
} catch (err) {
console.error('Failed to retrieve user:', err);
throw err;
}
}