2017-08-07 27 views
0

我試圖使用lodash鏈來同步執行動作,但它似乎.tap()首先執行,我找不到一個正確的方法來做到這一點使用諾言。我雖然鏈lodash允許行動,以在同步的方式跟隨,是指自來水不會執行,直到結束的forEach使用lodash,點擊()的鏈首先執行

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

沒有什麼異步這段代碼?你爲什麼提到承諾? – nem035

+0

@ nem035你是什麼意思,我的意思是使用諾而不是鏈 – kyserslick

+0

我不確定你的問題是什麼。你是說「tap」是先執行,你想知道爲什麼?或者你想重構這段代碼來使用承諾? –

回答

0

您正確使用chain我不認爲 - check out the docs,你有通過調用.value()來打開該值,如文檔示例中所示。 Tap實際上並不是先執行。

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

我不是100%肯定你正在嘗試做的,但我把它改寫使用地圖擺脫外ID:

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>

你仍然可能需要調整你的代碼以獲得你所期望的。

+0

我更新了我的代碼,實際上我正在嘗試分配ID,因爲我在抽頭內部做了更多的事情 – kyserslick

+0

@kyserslick更新您的問題以完全解釋您在內部點擊時想要做的事情。很可能你所做的是錯誤的,因爲頂級id只是分配給它的最後一個id。如果您正在嘗試合併ID,「減少」可能就是您想要的。 另外,你有'undefined'作爲輸出的原因是數組中的第二項沒有匹配具有ROSE和14M大小的ref。 –

+0

@kyserslick我剛剛更新了我的代碼,以打印出具有匹配skuID的結果數組。第一個項目有匹配,第二個項目沒有(因此它是未定義的)。在調用函數'value'後,lodash評估你的鏈('chain'啓動一個懶惰的評估表達式),並返回一個普通的值(在這個例子中是一個數組)。 –

0

如果添加一行轉儲idmap的價值,你會發現id設置兩次,第二次是null其覆蓋你想要的值。

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>