const a = [1, 2, 3, 4, 5]; const f = () => new Promise((resolve, reject) => resolve(4)); const g = () => { Promise.all(a.map((member) => f().then((res) => res))) .then((result) => { console.log(result) }); } g();
Pourquoi est-ce que je n’ai pas besoin d’un autre attaché à {return res;}
ici?
J’ai lu que quand vous avez un return (something)
dans un alors, un autre doit then
être attaché, mais ce n’est pas le cas ici. Aidez-moi?
Promise.all
s’attend à un éventail de promesses. .then
retourne une promesse. Par conséquent, votre logique de mappage convertit un tableau de nombres en un tableau de promesses, exactement ce dont vous avez besoin.
.then((res) => {return res;})
est tout à fait inutile, return f();
suffirait. Vous pouvez même simplifier votre code actuel pour:
Promise.all(a.map(f)).then(result => console.log(result));
J’ai lu que lorsque vous avez un
return (something)
dans unthen
, un autre doit alors être attaché
Cela n’a rien à voir avec .then
. .then
retourne simplement une promesse. Pour accéder au résultat d’une promesse, vous devez attacher un gestionnaire via .then
.
Vous n’avez pas besoin de faire cela ici, car vous tenez les promesses faites à Promise.all
. Vous .then((result)=>{console.log(result)})
ce résultat via .then((result)=>{console.log(result)})
.
Pourquoi est-ce que je n’ai pas besoin d’un autre attaché à
{return res;}
ici?J’ai lu que quand vous avez un
return (something)
dans un alors, un autre doitthen
être attaché, mais ce n’est pas le cas ici. Aidez-moi?
Il existe un autre .then()
attaché à Promise.all()
. Voulez-vous dire .catch()
doit être attaché pour éviter Uncaught (in promise)
?
Notez aussi que Promise.all()
n’est pas return
de l’appel g()
, pour enchaîner davantage la Promise
.
.then()
et .catch()
au sein d’ .map()
rappel .map()
peuvent être utilisés pour gérer une erreur ou une Promise
rejetée et renvoyer une Promise
résolue à .then()
chaînée à Promise.all()
; ou de throw
l’ Error()
actuelle ou nouvelle à l’appel Promise.all()
.
Le modèle peut également être utilisé pour renvoyer toutes les promesses passées à .map()
, qu’elles soient résolues ou rejetées en .then()
, sans appeler immédiatement .catch()
Promise.all()
à Promise.all()
function f (index) { return new Promise(function (resolve, reject) { if (index !== 4) resolve(4); else reject("err at index " + index) }) } var a =[1, 2, 3, 4, 5]; function g () { return Promise.all(a.map((member, index)=>{ return f(index).then((res) => {return res;}) .catch(e => {console.log(e); throw new Error(e)}) })) .then((result)=>{console.log(result); return result}) .catch(e => { // handle error here, return resolved `Promise`, // or `throw new Error(e)` to propagate error to // `.catch()` chained to `g()` call console.log("handle error within g", e); return "error " + e.message + " handled"}); } g() .then(data => {console.log(data) /* `error err at 4 handled` */ }) .catch(e => console.log("done", e));