Ma questo non sembra il modo corretto per farlo ..
Questo è davvero il modo corretto per farlo (o almeno un modo corretto per farlo). Questo è un aspetto chiave delle promesse, sono una pipeline ei dati possono essere massaggiati dai vari gestori nella pipeline.
Esempio:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
gestore omesso per brevità. Nel codice di produzione, sempre propagare la promessa o gestire il rifiuto.)
L'output che vediamo da questo è:
Primo gestore [1,2]
Seconda mano [10,20]
... perché il primo gestore ottiene la risoluzione delle due promesse ( 1
e 2
) come un array, quindi crea un nuovo array con ciascuno di questi moltiplicato per 10 e lo restituisce. Il secondo gestore ottiene ciò che il primo gestore ha restituito.
Se il lavoro aggiuntivo che stai facendo è sincrono, puoi anche inserirlo nel primo gestore:
Esempio:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... ma se è asincrono non vorrai farlo poiché finisce per essere annidato e l'annidamento può sfuggire rapidamente di mano.
reject
un valore dopo laPromise
funzione iniziale ? O il lancio di un errore in qualsiasi punto della catena ti porterà al.catch()
? Se è così, qual è il puntoreject
in primo luogo? Perché non lanciare semplicemente errori? Grazie ancora,