2016-08-28 2 views
1

permet donc dire que j'avais une séquence enchaînée comme ce qui suit:Lodash - comment effectuer la vérification des erreurs dans l'ordre à chaîne longue

let amount = _ 
    .chain(selectedItemsArray) 
    .map(item => _.find(availableItems, {id: item.id}) 
    //how can I determine that ALL items were found right here? 
    .filter('price_money') 
    ... 

Notez le commentaire dans le code ci-dessus. Il est possible que le selectedItemsArray ne soit pas à jour, donc certains éléments sélectionnés peuvent ne pas être dans availableItems. Donc, ma pensée initiale était d'utiliser un .tap ou .thru (probablement appuyez sur) pour faire quelque chose comme _.every(selectedItems, _.isObject) ou quelque chose de similaire pour attraper l'état d'erreur où tous les éléments sont trouvés et jeter une erreur si tous les éléments ont été trouvés. Cela semble étrange cependant ... de meilleures façons de gérer ce type d'erreur de vérification en milieu de séquence?

Quelque chose comme cela fonctionne (au moins je peux jeter une erreur), mais il semble que j'utilise tap pour quelque chose, ce n'est pas destiné à:

.tap(items => { 
    if (!_.every(items, _.isObject)) throw new Error('Some selected items are no longer available'); 
    }) 

Répondre

0

Vous pouvez utiliser un autre _.filter pour vérifier si la L'élément n'est pas un objet et gère également la valeur incriminée. Vous pouvez utiliser || pour exécuter le code de secours. Voir this question.

Si vous voulez que votre code plante et brûle lors de la première panne, utilisez une fonction qui génère une erreur au lieu d'utiliser console.error.

var available = [ 
 
    { id: 1, amount: 2.00 }, 
 
    { id: 2, amount: 4.00 } 
 
]; 
 
var selected = [1, 2, 3]; 
 

 
var amount = _(selected) 
 
    .map(item => _.find(available, {id:item}) || item) 
 
    .filter(item => _.isObject(item) || console.error("Item not available:", item)) 
 
    .sumBy('amount'); 
 

 
console.log("Amount:", amount.toFixed(2));
<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.min.js"></script>