如何使用 Ramda 管道?

Fla*_*nix 5 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"
Run Code Online (Sandbox Code Playgroud)

因此,打电话时createQuery({ lang: "es" })我将有以下的输出:[ "My query is es", ["en_en"] ];

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

R.tap(console.log, createQuery({lang: "es"}))
Run Code Online (Sandbox Code Playgroud)

一个组合(好吧,一个管道,准确地说)将是:

R.pipe( 
    createQuery( {lang: "en"} ), 
    R.tap(console.log) 
);
Run Code Online (Sandbox Code Playgroud)

它返回一个函数。

问题

现在假设我想执行上述功能:

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

comp({lang: "uk"}); //Blows Up!?
Run Code Online (Sandbox Code Playgroud)

为什么我的函数爆炸了f.apply is not a function??我究竟做错了什么?

Sco*_*her 6

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

您的示例函数comp可以像这样更新:

const comp = params => R.pipe(createQuery, R.tap(console.log))(params)
Run Code Online (Sandbox Code Playgroud)

并将参数R.pipe传递paramscreateQuery,然后将其结果提供给 `R.tap(console.log) 的结果。

通过删除 的直接应用,这可以简化为以下内容params

const comp = R.pipe(createQuery, R.tap(console.log));
Run Code Online (Sandbox Code Playgroud)