Ramdajs如何结合pipe与函数为对象新增属性
问题场景
现有柯里化异步函数定义如下:
const myfunction = (xyz) => async(param) => { return "some value " + xyz + param.a; }
现有Ramda pipe管道,初始入参为普通对象,结构如下:
R.pipe( )({"a":"a value"});
需求为:调用上述函数生成返回值,给传入的管道入参新增b属性,预期输出如下:
{ "a": "a value", "b": "some value xyz a value" }
已尝试两种写法均报参数错误,错误代码如下:
// 写法1 R.pipe( R.assoc("b", myfunction("xyz")), )({ "a" :"a value"}); // 写法2 R.pipe( R.assoc("b", myfunction("xyz")(R.identity)), )({ "a" :"a value"});
错误原因
- 写法1问题:
myfunction("xyz")执行后返回的是接收param的异步函数,并非计算完成的字符串值,直接传入R.assoc会把函数本身作为b属性的值,不符合预期。 - 写法2问题:直接将
R.identity函数本身作为入参传给内层异步函数,没有拿到pipe流程中流转的实际入参对象,无法读取到a属性的值。
正确实现
核心逻辑是:在pipe流程中拿到当前流转的入参对象,传给myfunction("xyz")执行拿到b的属性值,再执行属性挂载操作。两种常用实现方式如下:
方式1:使用R.chain串联
R.chain可以将接收上下文的函数与上下文操作串联,自动将pipe流转的对象传入计算函数:
// 注意:myfunction是async函数,最终返回Promise,需用await/.then()获取实体结果 const getResult = async () => { const res = await R.pipe( R.chain(R.assoc("b"), myfunction("xyz")) )({"a":"a value"}); console.log(res); // 输出符合预期的{a:"a value", b:"some value xyz a value"} return res; }
方式2:使用R.converge分支处理
将原对象分发给两个处理分支,一个分支计算b属性的值,一个分支保留原对象,最终传入R.assoc完成属性挂载:
const getResult = async () => { const res = await R.pipe( R.converge(R.assoc("b"), [ myfunction("xyz"), // 分支1:接收原对象,计算b的属性值 R.identity // 分支2:返回原对象本身 ]) )({"a":"a value"}); return res; }
内容的提问来源于stack exchange,提问作者Nadhas
相关产品推荐
相关产品推荐

