2017-08-07 4 views
0

J'essaie d'utiliser la chaîne lodash pour exécuter des actions de manière synchrone, mais il semble que .tap() soit exécuté en premier, et je n'ai pas trouvé de moyen approprié de le faire en utilisant la promesse. Je croyais que la chaîne en lodash permet de suivre les actions d'une manière synchronisation, signifie robinet ne sera pas exécuté jusqu'à la fin de forEachChaîne utilisant lodash, tap() est exécuté en premier

const ids = [ 
 
     { 
 
     "id": 1, 
 
     "refs": [ 
 
      { 
 
       "skuId": 693194, 
 
       "sizeId": "12M", 
 
       "colorId": "ROSE" 
 
      }, 
 
      { 
 
       "skuId": 693195, 
 
       "sizeId": "14M", 
 
       "colorId": "ROSE" 
 
      }, 
 
      { 
 
       "skuId": 973804, 
 
       "sizeId": "6M", 
 
       "colorId": "GREEN" 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "id": 2, 
 
     "refs": [ 
 
      { 
 
       "skuId": 693174, 
 
       "sizeId": "13M", 
 
       "colorId": "RED" 
 
      }, 
 
      { 
 
       "skuId": 693995, 
 
       "sizeId": "14M", 
 
       "colorId": "BLUS" 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
     
 
    let id = 1 
 
     
 
    _(ids) 
 
    .chain() 
 
    .map(value => { 
 
     id = _.result(_.find(value.refs, function(sku) { 
 
        return sku.colorId === 'ROSE' && 
 
        sku.sizeId === '14M'; 
 
            }), 'skuId'); 
 
            
 
    }) 
 
    .tap(() => console.log('id: ', id)) 
 
    .value()
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+1

Il n'y a rien async sur ce code? Pourquoi mentionnez-vous des promesses? – nem035

+0

@ nem035 que voulez-vous dire, je voulais dire utiliser la promesse au lieu de la chaîne – kyserslick

+0

Je ne suis pas sûr de ce que vous questionnez. Êtes-vous en train de dire que 'tap' est d'abord exécuté et que vous voulez savoir pourquoi? Ou vous voulez refactoriser ce code pour utiliser les promesses? –

Répondre

0

Je ne pense pas que vous utilisez chain correctement - check out the docs, vous avez pour déballer la valeur avec un appel à .value() comme dans l'exemple de documentation. Le tap n'est pas exécuté en premier.

let id = null; 

_.chain(ids) 
    .forEach(value => { 
    id = _.result(_.find(value.refs, function(sku) { 
     return sku.colorId === 'ROSE' 
     && sku.sizeId === '14M'; 
     }), 'skuId');          
    }) 
    .tap(() => console.log(id)) 
    .value(); 

Je ne suis pas 100% sûr de ce que vous essayez de faire, mais je réécrire pour utiliser la carte pour se débarrasser de cette id externe:

const ids = [ 
 
    { 
 
    "id": 1, 
 
    "refs": [ 
 
     { 
 
      "skuId": 693194, 
 
      "sizeId": "12M", 
 
      "colorId": "ROSE" 
 
     }, 
 
     { 
 
      "skuId": 693195, 
 
      "sizeId": "14M", 
 
      "colorId": "ROSE" 
 
     }, 
 
     { 
 
      "skuId": 973804, 
 
      "sizeId": "6M", 
 
      "colorId": "GREEN" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "id": 2, 
 
    "refs": [ 
 
     { 
 
      "skuId": 693174, 
 
      "sizeId": "13M", 
 
      "colorId": "RED" 
 
     }, 
 
     { 
 
      "skuId": 693995, 
 
      "sizeId": "14M", 
 
      "colorId": "BLUS" 
 
     } 
 
    ] 
 
    } 
 
] 
 

 
let val = _.chain(ids) 
 
    .map(value => { 
 
    return _.result(
 
     _.find(
 
     value.refs, 
 
     sku => sku.colorId === 'ROSE' && sku.sizeId === '14M' 
 
    ), 
 
     'skuId'); 
 
    }) 
 
    .value(); 
 

 
console.log(val);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Vous aurez peut-être besoin de modifier un peu votre code pour obtenir ce que vous attendez.

+0

J'ai mis à jour mon code, en fait j'essaye d'assigner l'Id parce que je fais plus de choses avec l'intérieur du robinet – kyserslick

+0

@kyserslick Mettez à jour votre question pour expliquer complètement ce que vous essayez de faire à l'intérieur du robinet. Il est probable que ce que vous faites est erroné puisque le niveau supérieur 'id' est seulement le dernier identifiant qui lui est assigné. Si vous essayez de combiner les ID, «réduire» est probablement ce que vous voulez. La raison pour laquelle vous avez 'undefined' comme résultat est que le second élément de votre tableau n'a pas de correspondance pour un ref qui a à la fois ROSE et 14M. –

+0

@kyserslick Je viens de mettre à jour mon code pour imprimer le tableau résultant, qui a les skuID correspondants. Le premier élément a une correspondance, le second élément ne l'est pas (d'où il est indéfini). Après avoir appelé la fonction 'value' lodash évalue votre chaîne (' chain' initie une expression évaluée paresseusement), et retourne une valeur simple (dans ce cas un tableau). –

0

Si vous ajoutez une ligne à vider la valeur de l'intérieur idmap, vous remarquerez id a été mis deux fois et la 2ème fois était null qui surchargent la valeur que vous vouliez.

const ids = [ 
 
     { 
 
     "id": 1, 
 
     "refs": [ 
 
      { 
 
       "skuId": 693194, 
 
       "sizeId": "12M", 
 
       "colorId": "ROSE" 
 
      }, 
 
      { 
 
       "skuId": 693195, 
 
       "sizeId": "14M", 
 
       "colorId": "ROSE" 
 
      }, 
 
      { 
 
       "skuId": 973804, 
 
       "sizeId": "6M", 
 
       "colorId": "GREEN" 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "id": 2, 
 
     "refs": [ 
 
      { 
 
       "skuId": 693174, 
 
       "sizeId": "13M", 
 
       "colorId": "RED" 
 
      }, 
 
      { 
 
       "skuId": 693995, 
 
       "sizeId": "14M", 
 
       "colorId": "BLUS" 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
     
 
    let id = 1 
 
     
 
    _(ids) 
 
    .chain() 
 
    .map(value => { 
 
     id = _.result(_.find(value.refs, function(sku) { 
 
        return sku.colorId === 'ROSE' && 
 
        sku.sizeId === '14M'; 
 
            }), 'skuId'); 
 
     // Add this line to inspect the id value in map 
 
     console.log('id (in map): ', id); 
 
    }) 
 
    .tap(() => console.log('id: ', id)) 
 
    .value()
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>