2017-08-07 3 views
0

Ich versuche, lodash Kette zu verwenden, um Aktionen synchron auszuführen, aber es scheint .tap() wird zuerst ausgeführt, und ich konnte einen richtigen Weg, um dies zu tun mit Versprechen. Ich obwohl Kette in lodash Aktionen in einem Sync-Weg folgen können, bedeutet Hahn wird nicht ausgeführt, bis forEach endetKette mit lodash, tap() wird zuerst ausgeführt

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

Es gibt async nichts über diesen Code? Warum erwähnst du Versprechungen? – nem035

+0

@ nem035 was meinst du, ich meinte Versprechen statt Kette – kyserslick

+0

Ich bin mir nicht sicher, was Sie in Frage stellen. Willst du sagen, dass 'tap' zuerst ausgeführt wird und du wissen willst warum? Oder Sie möchten diesen Code umgestalten, um Versprechungen zu verwenden? –

Antwort

0

Ich glaube nicht, Sie chain richtig verwenden - check out the docs, Sie haben Um den Wert mit einem Aufruf an .value() wie im Dokumentationsbeispiel auszupacken. Tap wird zuerst nicht ausgeführt.

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(); 

Ich bin nicht 100% sicher, was Sie versuchen zu tun, aber ich würde es neu schreiben Karte verwenden dieser äußeren ID loszuwerden:

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>

Sie müssen möglicherweise noch etwas Code ein wenig zwicken, um zu bekommen, was Sie erwarten.

+0

Ich habe meinen Code aktualisiert, in der Tat versuche ich ID zuzuweisen, weil ich mehr Dinge mit dem Wasserhahn mache – kyserslick

+0

@kyserslick Aktualisieren Sie Ihre Frage, um zu erklären, was Sie in Tap zu tun versuchen. Es ist wahrscheinlich falsch, was Sie tun, da die oberste Ebene id nur die letzte zugewiesene ID ist. Wenn Sie versuchen, die IDs zu kombinieren, ist "Reduzieren" wahrscheinlich das, was Sie wollen. Der Grund, warum Sie als Ausgabe "undefined" haben, ist, dass das zweite Element in Ihrem Array keine Übereinstimmung für eine Ref hat, die sowohl die Farbe ROSE als auch die Größe 14M hat. –

+0

@kyserslick Ich habe gerade meinen Code aktualisiert, um das resultierende Array auszudrucken, das die passenden SkuIDs enthält. Das erste Element hat eine Übereinstimmung, das zweite Element nicht (daher ist es undefiniert). Nach dem Aufruf der Funktion "value" wertet lodash Ihre Kette aus ("chain" löst einen träge ausgewerteten Ausdruck aus) und gibt einen einfachen Wert (in diesem Fall ein Array) zurück. –

0

Wenn Sie eine Linie werfen den Wert von id innerhalb map hinzufügen, werden Sie feststellen, id eingestellt wurde zweimal und das zweite Mal war null, die den Wert außer Kraft setzen Sie wollten.

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>

Verwandte Themen