如果我想组合一系列函数,我可以使用 compose
,这将允许我定义一系列函数,将一个或多个参数传递给第一个,然后返回值第一个传递给第二个,第二个的返回值传递给第三个,依此类推...
compose(f3, f2, f1)(value);
相当于:
f3(f2(f1(value)))
但是,如果我想用 value
调用所有三个函数怎么办?
我的用例是我有一系列验证数据的函数。在每种情况下,如果值有效,函数要么抛出不执行任何操作的错误。我需要以这样一种方式组合这些验证函数,即传入一个值将导致每个函数按顺序调用该值。有效地:
f1(value);
f2(value);
f3(value);
// Do something now we are sure the value is valid.
我能看到使用 ramda 提供的函数执行此操作的唯一方法是使用逻辑运算符来防止在值返回 false 时发生短路:
const f1 = (v) => console.log(`f1 called with '${v}'`);
const f2 = (v) => console.log(`f2 called with '${v}'`);
const f3 = (v) => console.log(`f3 called with '${v}'`);
const callAll = compose(complement, anyPass);
callAll([f1, f2, f3])('x');
然而,这感觉像是对 anyPass
的误用。这是实现我想要的最合适的方法吗?
最佳答案
However, what if I want all three functions to be called with value?
在一个 值上运行多个函数的函数称为R.converge .
R.converge(
() => {},
[f1, f2, f3],
)('x');
第二个参数是一个函数数组。值(在本例中为“x”)按顺序放入其中。
但是在那之后,R.converge 获取 f1、f2、f3 的返回值并将它们作为第一个参数的参数抛出。您不需要 R.converge 的那部分,因为您没有对返回值做任何事情,所以您可以只使用一个什么都不做的函数。
因此,一个 callAll 可以写成:
const callAll =
R.converge(() => {});
执行方式如下:
callAll([f1, f2, f3])('x');
或非柯里化(Currying):
const callAll =
R.uncurryN(2, R.converge(() => {}));
callAll([f1, f2, f3], 'x');
关于javascript - 在 Ramda 中组合函数,每个函数接收相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572808/