【问题标题】:forward function parameters to arguments with ramda使用 ramda 将函数参数转发到参数
【发布时间】:2017-09-11 23:14:56
【问题描述】:

我正在用一个 react-project 玩 Ramda 和 FP。我想更多地学习用 FP 编写干净的代码,所以如果存在更干净的方式,我会过度考虑每一行。 现在我遇到了这个问题,但找不到让我开心的解决方案:

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

我必须将所有参数作为参数传递给内部函数。当然,这可行,但它并不是很好。如果我要更改内部函数的签名,我还必须在此函数调用中更改它。一种解决方案也是:

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

我错过了什么还是这是最好的方法?

(要了解我想要做的更多上下文,you can look at this Ramda REPL。)

(我已经看过How do I pass in multiple parameters into a Ramda compose chain?,但我认为这不适用于我的问题,或者我只是不明白)

【问题讨论】:

  • 你的函数没有返回值,所以它不起作用。这里也不清楚您要做什么。您正在不必要地使用函数来替换控制流结构,而这样做却一无所获,并使用自定义变体复制基本的 Ramda 函数,如 prop
  • 对不起,我错了。你所需要的只是 monads 的函数实例:chain = f => g => x => g(f(x)) (x); of = x => y => x; ask = x => x。然后,您可以通过链接它们来创建共享参数的读取器函数。我知道函数是 Ramda 中的 monad,因为 ask 只是 id 你应该可以用 Ramda 来做到这一点。

标签: javascript functional-programming ramda.js


【解决方案1】:

你太复杂了。

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

【讨论】:

  • REPL 中的最后几行只是函数的示例用法。这种特定情况可以更容易地完成,但我想标准化我在 react-components 中的错误处理:仅在不为 null 时处理错误,处理已知错误(可能是不同的错误,并不总是具有 code-prop)和未知错误记录它们并显示默认消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2021-04-25
  • 2018-04-25
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
相关资源
最近更新 更多