2017-09-11 2 views
0

Je joue avec Ramda et FP avec un projet de réaction. Je veux apprendre un peu plus à écrire du code propre avec FP, et donc je pense à chaque ligne s'il existe un moyen plus simple ou plus propre. Maintenant, je suis ici avec ce problème et je ne peux pas trouver une solution qui me rend heureux:transférer des paramètres de fonction aux arguments avec ramda

const mapErrorToErrorNode = (onUnknownError, transformUnknownError, getKnownError) => R.pipe(
    R.prop('error'), 
    handleErrorIfExists(onUnknownError, transformUnknownError, getKnownError), 
    R.assoc('errorNode', R.__, {}), 
); 

Je dois passer tous les paramètres à la fonction interne comme arguments. Bien sûr, cela fonctionne mais ce n'est pas vraiment sympa. Si je change la signature de la fonction interne, je dois aussi la changer dans cette fonction-appel. Une solution serait également:

const mapErrorToErrorNode = (...args) => R.pipe(
    R.prop('error'), 
    R.apply(handleErrorIfExists, args), 
    R.assoc('errorNode', R.__, {}), 
); 

Ai-je manqué quelque chose ou est-ce la meilleure approche?

(pour plus de contexte ce que je suis en train de faire, you can look at this Ramda REPL.)

(et je l'ai déjà regardé How do I pass in multiple parameters into a Ramda compose chain?, mais je ne pense pas que cela vaut pour ma question ou peut-être que je ne comprends pas it)

+1

Votre fonction n'a pas de valeur de retour, elle n'est donc pas fonctionnelle. Ce n'est pas clair du tout ce que vous essayez de faire. Vous utilisez inutilement des fonctions pour remplacer les constructions de flux de contrôle où vous ne gagnez rien en faisant cela, et en reproduisant les fonctions de base de Ramda comme 'prop' avec des variantes personnalisées. –

+0

Désolé, j'avais tort. Tout ce dont vous avez besoin est l'instance de fonction des monades: 'chain = f => g => x => g (f (x)) (x); de = x => y => x; demander = x => x'. Vous pouvez ensuite créer des fonctions de lecture partageant un argument en les chaînant. Je sais que les fonctions sont des monades à Ramda et puisque 'ask' est juste 'id', vous devriez pouvoir le faire avec Ramda. – ftor

Répondre

0

Vous êtes trop compliquer cela.

const knownErrorCodes = { 
    'code-1': 'msg' 
}; 

const defaultErrorMsg = 'unknown'; 

const mapErrorToCode = R.pipe(
    R.prop('code'), // plucks the error code 
    R.propOr(R.__, knownErrorCodes, defaultErrorMsg) // gives you the message or the default 
); 

console.log(mapToErrorCode({ code: 'code-1' })); // msg 
console.log(mapToErrorCode({ code: 'code-2' })); // unknown 
+0

Les dernières lignes du REPL sont juste un exemple d'utilisation des fonctions. Ce cas particulier peut être fait plus facile mais je veux normaliser ma gestion des erreurs dans les composants de réaction: gérer l'erreur seulement si non null, gérer les erreurs connues (qui peuvent être différentes, pas toujours avec le code-prop) et Les erreurs inconnues les consignent et affichent un message par défaut. –