javascript - 如何打破 compose 或 pipe 并返回所有当前数据?
问题描述
我正在使用管道进行登录输入验证,如果可能,我想中断并返回当前数据。甚至有可能从 a 中断和返回数据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
然后在减速器中途解决?
解决方案
这是一个递归管道的示例,一旦当前值不满足谓词,它就会中断调用链:
const pipeWhile = pred => (f, ...fs) => x =>
pred(x) && f
? pipeWhile (pred) (...fs) (f(x))
: x;
当编写为常规while
或for
循环时,可能更容易阅读维护。
这是与您提供的示例一起使用的:
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',
})
)
推荐阅读
- jekyll - How to check with Liquid if I am in the home page?
- python - Split pandas list to different column and calculate the counts
- r - 如何在 R Shiny 的 textInput 中传递一行代码?
- javascript - TypeError:无法读取 JSONPlaceholder 未定义的属性“url”
- python - 在 PyMongo 中创建列表
- electron - Electron nsis-web,如何更改工件名称
- java - Spring Framework 中的原型 bean 范围实现
- python - Anaconda 导航器和 Python 卸载
- python-3.x - super() 的多重继承问题
- python - 如何解决 Python while 循环问题?