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

Javascript 如何从compose或pipe中断并返回所有当前数据?,javascript,functional-programming,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_F

我正在使用管道进行登录输入验证,如果可能的话,我想中断并返回当前数据。甚至可以从
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: '',
})

也许我可以用一个
新的Promise
来包装所有内容,并在reducer的中间解决问题?

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

const pipeWhile = pred => (f, ...fs) => x =>
  pred(x) && f 
    ? pipeWhile (pred) (...fs) (f(x))
    : x;
当编写为常规
for
循环时,可能更容易阅读维护

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

constpipewhile=pred=>(f,…fs)=>x=>
pred(x)和f
? 风笛(pred)(…fs)(f(x))
:x;
常数noError=x=>!x、 hasOwnProperty(“错误”);
常量规则=(错误,pred)=>x=>pred(x)
? x:{…x,错误:[错误]}
const validation=pipeWhile(无错误)(
规则(“名称是假的”,obj=>!!obj.NAME),
规则(“密码是假的”,obj=>!!obj.PASSWORD)
);
console.log(
验证({
名称:“”,
密码:“”,
}),
验证({
姓名:'简',
密码:“”,
}),
验证({
姓名:'简',
密码:“PA$$W0RD”,
})

)
如果管道中的每个步骤都返回一个Maybe对象,则可以使用Ramda中的pipeK函数创建一个基于Kleisli合成的管道,该管道将一直运行,直到其中一个步骤返回Nothing。您可以从SANCATION MAYE包中获得一个MAYE实现。

除了抛出异常(或检查
.error
s)之外,没有。当您需要
中断
语句或递归时,请使用普通循环,而不是
减少
。不,不要使用承诺,这里没有异步!你说得对。扔肯定有用!或者,OP需要某种类型的
错误
monad/monoid,而不是
Maybe
。他似乎已经在不知不觉中使用了一个。