如何使用Ramda管?

时间:2018-01-09 09:28:02

标签: javascript functional-programming ramda.js

背景

我正在尝试使用Ramda编写2个函数,但我遇到pipe的问题,这意味着我不知道如何使用它。

代码

让我们假设我有一个返回数组的函数:

var createQuery = params => [ getSQLQuery( params ), [ getMarket() ] ];

var getSQLQuery = ( { lang } ) => `My query is ${lang}`;

var getMarket = () => "en_en"

因此,在调用createQuery({ lang: "es" })时,我会得到以下输出:[ "My query is es", ["en_en"] ];

现在,让我们假设我是一个讨厌的男孩,我想点击这个重要的信息!

R.tap(console.log, createQuery({lang: "es"}))

组合物(井,管道,确切地说)将是:

R.pipe( 
    createQuery( {lang: "en"} ), 
    R.tap(console.log) 
);

返回一个函数。

问题

现在让我们说我想执行所说的功能:

var comp = params => R.pipe( 
        createQuery( params ), 
        R.tap(console.log) 
    )(params);

comp({lang: "uk"}); //Blows Up!?

为什么我的功能会被f.apply is not a function炸毁? 我做错了什么?

1 个答案:

答案 0 :(得分:3)

您遇到的问题是因为您正在调用createQuery(params),然后尝试将结果视为一种功能。

您的示例功能comp可以像这样更新:

const comp = params => R.pipe(createQuery, R.tap(console.log))(params)

R.pipe会将params和参数传递给createQuery,然后将结果赋予`R.tap(console.log)。

通过删除params

的即时应用,可以将其简化为以下内容
const comp = R.pipe(createQuery, R.tap(console.log));