如何正确使用Ramda pipe?调用组合函数报错问题排查
问题分析与解决
我来帮你梳理下这个Ramda pipe使用的问题,核心错误其实是对R.pipe的参数类型理解有误~
错误根源
R.pipe的参数必须是函数序列,它会把输入值依次传递给每个函数,前一个函数的输出作为后一个函数的输入。而你在代码里写的:
R.pipe( createQuery( {lang: "en"} ), R.tap(console.log) )
这里的createQuery( {lang: "en"} )是直接执行了函数,返回的是一个数组值,不是函数。当pipe尝试把这个数组当作函数去调用时,自然会抛出f.apply is not a function的错误——数组根本不是可调用的函数类型。
正确写法
基础版:直接传递函数给pipe
既然createQuery本身就是接收参数返回数组的函数,我们直接把它放进pipe里即可:
var comp = R.pipe(createQuery, R.tap(console.log)); comp({lang: "uk"});
执行这段代码会得到你预期的结果:
- pipe把
{lang: "uk"}传给createQuery,生成数组["My query is uk", ["en_en"]] - 这个数组被传给
R.tap(console.log),打印数组的同时返回原值
进阶版:添加中间处理步骤
如果需要在调用createQuery前对参数做一些处理(比如补全默认值),可以在pipe里插入额外的函数:
var comp = R.pipe( // 示例:给参数添加默认lang值 R.defaults({ lang: "en" }), createQuery, R.tap(console.log) ); // 调用时不传lang,会使用默认值 comp({}); // 输出 ["My query is en", ["en_en"]]
再看你原来的错误写法
你之前尝试的:
var comp = params => R.pipe( createQuery( params ), R.tap(console.log) )(params);
这里pipe的第一个参数是createQuery(params)的执行结果(数组),pipe会尝试把这个数组当作函数去调用并传入params,这显然不符合逻辑——数组无法被当作函数执行,所以才会报错。
内容的提问来源于stack exchange,提问作者Flame_Phoenix
相关产品推荐
相关产品推荐

