javascript - 如何中断 compose 或 pipe 并返回所有当前数据?

标签 javascript functional-programming

我正在使用管道进行登录输入验证,如果可能的话,我想中断并返回当前数据。甚至可以从 reduce 中中断并返回数据吗?

我当前的代码示例:

const pipe = (...fns) => fns.reduce((f, g) => (obj) => g(f(obj)))

pipe(
  (obj) => {
    console.log('fn1', obj)
    return { ...obj, ...(!!obj.name || { error: ['NAME_IS_FALSEY'] })} 
  },
  (obj) => {
    // if ((obj || {}).error ) return obj
    console.log('[fn2]', obj)
    return { 
      ...obj,
      ...(
        !!obj.password ||
    obj.error ?
      { error: [...obj.error, 'PASSWORD_IS_FALSEY'] } :
          { error: 'PASSWORD_IS_FALSEY' }
      )
    }   
  },
  (obj) => console.log('[fn3 etc...]', obj)
)({
  name: '',
  password: '',
})

也许我可以将所有内容包装在 new Promise 中并在 reducer 中途解析?

最佳答案

这是一个递归管道的示例,它会在当前值不满足谓词时立即中断调用链:

const pipeWhile = pred => (f, ...fs) => x =>
  pred(x) && f 
    ? pipeWhile (pred) (...fs) (f(x))
    : x;

当编写为常规 whilefor 循环时,阅读维护可能更容易。

这是与您提供的示例一起使用的:

const pipeWhile = pred => (f, ...fs) => x =>
  pred(x) && f 
    ? pipeWhile (pred) (...fs) (f(x))
    : x;
    

const noError = x => !x.hasOwnProperty("error");
const rule = (error, pred) => x => pred(x) 
  ? x : { ...x, error: [error] }

const validation = pipeWhile(noError)(
  rule("NAME_IS_FALSEY", obj => !!obj.name),
  rule("PASSWORD_IS_FALSEY", obj => !!obj.password)
);

console.log(
  validation({
    name: '',
    password: '',
  }),
  validation({
    name: 'Jane',
    password: '',
  }),
    validation({
    name: 'Jane',
    password: 'PA$$W0RD',
  })
)

关于javascript - 如何中断 compose 或 pipe 并返回所有当前数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028113/

相关文章:

javascript - 如何反转()关联数组(对象)?

javascript - 防止 JQuery 加载时出现错误 503

java - 如何将返回 Completable 的函数列表链接起来依次运行?

javascript - “功能性”生成一个仅包含几个元素的列表

scala - scala 编译器对类型系统内的单元类型有什么特殊的规则

c++ - 向 C++ 程序员解释 ML 类型推断

javascript - 如何从 IonMonkey 获取汇编代码

javascript - 仅替换部分正则表达式匹配

javascript - Vee-validate 仅验证某些字段

f# - 枚举示例的 Ocaml 类型错误