J'ai un tableau comme une structure qui expose les méthodes asynchrones. La méthode async appelle des structures de tableau de retour qui à leur tour exposent plus de méthodes async. Je crée un autre objet JSON pour stocker les valeurs obtenues à partir de cette structure et je dois donc faire attention au suivi des références dans les rappels.
J'ai codé une solution de force brute, mais j'aimerais apprendre une solution plus idiomatique ou plus propre.
- Le modèle doit être répétable pour n niveaux d'imbrication.
- Je dois utiliser promise.all ou une technique similaire pour déterminer quand résoudre la routine englobante.
- Tous les éléments n'impliqueront pas nécessairement de faire un appel asynchrone. Donc, dans une promesse imbriquée.all, je ne peux pas simplement attribuer des éléments à mes éléments de tableau JSON en fonction de l'index. Néanmoins, je dois utiliser quelque chose comme promise.all dans le forEach imbriqué pour m'assurer que toutes les attributions de propriété ont été effectuées avant de résoudre la routine englobante.
- J'utilise la librairie bluebird promise mais ce n'est pas une exigence
Voici un code partiel -
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
Promise.map
(simultané) et Promise.each
(séquentiel) dans ce cas, également la note Promise.defer
est obsolète - le code dans ma réponse montre comment l'éviter en renvoyant des promesses. Les promesses concernent toutes les valeurs de retour.