Nouveau aux promesses, aimerait apprendre. J'ai ce tableau de shopIds:promesses.toutes avec des valeurs supplémentaires
let shopIdsArray = ['shop1','shop2','shop3'];
et un appel de promesse externe
getProducts(shopId, 'products') //promise returns the products of this shop
Malheureusement, la promesse ne retourne pas le shopId, seulement les produits, donc je dois garder en quelque sorte le shopId et Rangez-le avec les produits une fois la promesse faite. Mon approche actuelle est d'appeler la promesse à chaque shopId, et ajouter le résultat de chaque appel de promesse à un shopsAndProductsArray comme ceci:
shopsAndProductsArray.push({
"id":shopId,
"products":products
});
Plus tard, ma « promesse d'emballage » doit retourner le shopsAndProductsArray fini.
Mon code actuel (noeud, ES6) ressemble à:
updateProducts = new Promise(
function (resolve, reject) {
let shopIdsArray = ['shop1','shop2','shop3'];
const shopsAndProductsArray = [];
let promisesArray = [];
shopIdsArray.forEach((shopId) => {
let promise = getProducts(shopId, 'products')
.then((products) => {
const shopInfoObject = {
"id":shopId,
"products":products
};
console.log("sio: ",shopInfoObject); //prints shopIds and products fine.
shopsAndProductsArray.push(shopInfoObject);
promisesArray.push(promise);
});
});
Promise.all(promisesArray)
.then(function (shopsAndProductsArray) {
resolve(shopsAndProductsArray); //the shopsAndProductsArray is undefined?
});
}
);
Sur résolution, le shopsAndProductsArray est ... pas vide, mais se compose du même nombre d'entrées que le shopIdsArray, mais les éléments du tableau sont indéfinis. Je devrais probablement mettre les promesses dans un tableau d'abord, puis travailler sur eux dans Promise.all, mais à ce moment-là j'ai perdu la référence à quel magasin id la promesse appartient. J'ai lu beaucoup d'autres exemples sur l'itération et les promesses et essayé de nombreuses autres façons, mais il semble que je n'ai pas entièrement compris ce que l'on appelle à quel point. Je suis sûr que remplir le tableau des promesses comme je le fais est faux, mais je n'avais aucune meilleure idée de la façon d'invoquer Promise.all.
Je pense que je pourrais réduire mes questions jusqu'à:
- Comment dois-je itérer sur les shopIds, appelant la promesse avec chacun?
- Comment puis-je conserver le shopId une fois qu'une promesse renvoie une liste de produits?
- Comment puis-je retourner le tableau des shopIds et des produits une fois que tous les shopIds ont été traités?
Merci d'avance pour toute aide.
EDIT: Merci beaucoup, Justelouise et Felix Kling. Je savais que je complaisais les choses, mais je ne pouvais pas mettre le doigt où. Je comprends maintenant ce qui me manquait, grâce à vos exemples. Je pense que vos réponses sont essentiellement égales et toutes deux bien expliquées. Je donne la coche d'acceptation à Justelouise parce qu'elle semble être le premier et Felix Kling a légèrement plus de réputation O_o.
Vous appelez 'shopsAndProductsArray.push (exchangeInfoObject);' mais l'objet que vous créez est affecté à 'shopInfoObject'. –
Toutes vos promesses se résolvent en 'undefined' - parce que votre' .then (products => 'ne renvoie rien ... ce qui explique pourquoi' shopsAndProductsArray' est un tableau de 'function non défini (shopsAndProductsArray)' –
note: votre 'const shopsAndProductsArray = []; 'n'est jamais utilisé pour quoi que ce soit –