【问题标题】:is there a way to make the second function use the first one: syntax有没有办法让第二个函数使用第一个函数:语法
【发布时间】:2019-07-15 17:23:58
【问题描述】:
export const composeValidators = (...validators) => value => validators.reduce((error, validator) => error || validator(value), undefined);

export const composeAccreditionValidators = (... validators) => value => validators.reduce((error, validator) => validator(value) === undefined ? error : `! ${validator(value)}`, undefined);

我正在尝试专门为我的一个组件创建第二个函数,并且希望让第二个函数调用第一个函数。从语法上讲,我可能会犯一些错误,因此代码对我来说很糟糕。有人可以帮忙吗?

注意:我想保持第二个的逻辑完整。本质上,它将输出字符串包装在 !和第一个不同的空间。


编辑:这里写的是相同的函数,所以它们更容易阅读。

function composeValidators(...validators) {
  return function (value) {
    return validators.reduce((error, validator) => (
      error || validator(value)
    ), undefined)
  }
}

function composeAccreditionValidators(...validators) {
  return function (value) {
    return validators.reduce((error, validator) => (
      validator(value) === undefined
        ? error
        : `! ${validator(value)}`
      ), undefined);
  }
}

【问题讨论】:

  • 我对您的示例进行了一些修改,以尝试了解您要做什么。编辑后,我发现很难得到它。您能否详细说明您想要实现的目标?
  • 感谢您的编辑。我试图从第二个函数调用第一个函数,如果返回错误字符串,则将第二个函数的结果包装在空格和感叹号中。否则返回未定义。
  • @guzmonne 我相信目标是通过重用composeValidators() 使composeAccreditionValidators 更加干燥。我想这将需要修改 composeValidators() 的定义才能做到这一点。
  • 是的,这是正确的@Patrick Roberts
  • 我不确定你是否知道,但输出格式并不是这两个验证器作曲家之间唯一不同的地方。主要区别在于默认作曲家调用每个验证器 0-1 次,而“认证”作曲家调用每个验证器 1-2 次。呼叫量是您希望保留的行为的一部分吗?此外,验证器是否会返回 undefined 以外的虚假值?如果这两个问题的答案都是“否”,那么muZk's answer 应该可以工作,否则就不行。

标签: javascript reactjs ecmascript-6 react-redux react-final-form


【解决方案1】:

您可以编写一个包含这两个函数的函数,并以柯里化的reducer 函数作为输入:

const createComposeValidators = reducer => (...validators) => value =>
  validators.reduce(reducer(value), undefined)

export const composeValidators = createComposeValidators(
  value => (error, validator) =>
    error || validator(value)
)

export const composeAccreditionValidators = createComposeValidators(
  value => (error, validator) =>
    validator(value) === undefined ? error : `! ${validator(value)}`
)

下面是相同的函数,所以更容易阅读:

function createComposeValidators(reducer) {
  return function composeValidators(...validators) {
    return function (value) {
      return validators.reduce(reducer(value), undefined)
    }
  }
}

【讨论】:

    【解决方案2】:

    另一种选择是在 composeAccreditionValidators 函数中使用 composeValidators 函数:

    function composeValidators(...validators) {
      return function (value) {
        return validators.reduce((error, validator) => (
          error || validator(value)
        ), undefined)
      }
    }
    
    function composeAccreditionValidators(...validators) {
      const validate = composeValidators(...validators);
      return function (value) {
        const error = validate(value);
        return error && `! ${error}`;
      }
    }
    

    【讨论】:

    • 我不相信您的 composeAccreditionValidators() 在功能上等同于问题中的那个......例如,如果任何验证器返回一个不是 undefined 的虚假值,您依赖的默认行为将与应有的行为不同,并且您在回调中获得的累积 error 将不是它所需要的。
    • 另一个更容易验证的区别是,应该保证专门的行为会调用每个validator(),而默认行为不会在第一个返回的validator()函数之后调用其余的函数一个真实的价值。
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多