[英]Ramdajs - how to combine pipe and function to update an object
我有一个接受两个参数的函数。
const myfunction = (xyz) => async(param) => {
return "some value " + xyz + param.a;
}
和一个以对象为参数的管道,
R.pipe(
)({"a":"a value"});
如何使用函数返回值向对象添加新属性?
预期输出:
{
"a": "a value",
"b": "some value xyz a value"
}
尝试了以下,但参数错误
R.pipe(
R.assoc("b", myfunction("xyz")),
)({ "a" :"a value"});
R.pipe(
R.assoc("b", myfunction("xyz")(R.identity)),
)({ "a" :"a value"});
我认为 Ramda 并没有为此内置任何东西。 我们可以将它写在几个 Ramda 函数之上,如下所示:
const myfunction = (xyz) => async (param) => { return "some value " + xyz + param .a } const foo = (param) => myfunction ('xyz') (param) .then (flip (assoc ('b')) (param)) foo ({a: 'a value'}) .then (console .log)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {flip, assoc} = R </script>
但目前还不清楚这是否比普通 JS 版本更好,例如:
const foo = (param) =>
myfunction ('xyz') (param) .then (v => ({...param, b: v}))
(我是 Ramda 的创始人和忠实粉丝;它根本不会试图解决所有问题。)
然而,其中任何一个都有一个有趣的抽象,创建我们自己的组合器来处理(f, g) => (x) => f (x) .then (g (x))
的整体流程。 因为它感觉比较接近pipe
ing,并且因为有以鸟类命名组合子的强大传统,所以我将其命名为piper
,是“sandpiper”的缩写。 抽象出来,我们可以将foo
简化为如下所示:
const piper = (f, g) => (p) => f (p) .then (g (p)) const myfunction = (xyz) => async (param) => { return "some value " + xyz + param .a } const foo = piper (myfunction ('xyz'), flip (assoc ('b'))) foo ({a: 'a value'}) .then (console .log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {flip, assoc} = R </script>
这是一种非常强大的技术,可以抽象出我们函数的逻辑框架,以便在多个地方使用。 当然,它不会对像这样的单个函数添加任何内容,但它可以让我们找到与未来代码的共同点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.