JavaScript调用多函数,但输入值是最后一个函数的输出

JavaScript调用多函数,但输入值是最后一个函数的输出,javascript,function,methods,ecmascript-6,functional-programming,Javascript,Function,Methods,Ecmascript 6,Functional Programming,我有一个这样的函数: function intiFun(initValue) { const firstResult = firstFun(initValue); const secondResult = secondFun(firstResult); const thirdResult = thirddFun(secondResult); const fourthResult = fourthFun(thirdResult); return fourt

我有一个这样的函数:

function intiFun(initValue) {

    const firstResult = firstFun(initValue);
    const secondResult = secondFun(firstResult);
    const thirdResult = thirddFun(secondResult);
    const fourthResult = fourthFun(thirdResult);
    return fourthResult;
}
function intiFun(initValue) {
    return firstFun(initValue)         
          .secondFun(secondInput)
          .thirddFun(secondInput)
          .fourthFun(secondInput)
}

function secondFun(value, secondInput) {
    return ...;
}
...

但我想写得更好。我不想把每个函数的值保存为变量

是否有任何方法可以在不保存旧值的情况下调用函数

比如rxjs或者类似的东西:

function intiFun(initValue) {
    return firstFun(initValue).secondFun().thirddFun().fourthFun();
}
或者更像这样:

function intiFun(initValue) {

    const firstResult = firstFun(initValue);
    const secondResult = secondFun(firstResult);
    const thirdResult = thirddFun(secondResult);
    const fourthResult = fourthFun(thirdResult);
    return fourthResult;
}
function intiFun(initValue) {
    return firstFun(initValue)         
          .secondFun(secondInput)
          .thirddFun(secondInput)
          .fourthFun(secondInput)
}

function secondFun(value, secondInput) {
    return ...;
}
...
或者一些慷慨地这样做(也许是洛达斯)

或者,将您的功能转换为承诺:

function initFun(initValue) {
    return firstFun(initValue)
        .then(secondFun)
        .then(thirddFun)
        .then(fourthFun);
}

你可以这样做

const firstFun=x=>x+1;
const secondFun=x=>x+1;
常数thirdFun=x=>x+1;
常数fourthFun=x=>x+1;
constpipe=(…函数)=>x=>functions.reduce((x,f)=>f(x,x);
const initFun=pipe(第一个fun、第二个fun、第三个fun、第四个fun);

console.log(initFun(3))您要查找的结果可以通过使用来实现

let log=(head,…args)=>{console.log('log:',head,…args);返回head},
firstFun=(str,…args)=>log(str,…args)+“firstFun”,
secondFun=(str,…args)=>log(str,…args)+“secondFun”,
thirdfun=(str,…args)=>log(str,…args)+“thirdfun”,
fourthFun=(str,…args)=>log(str,…args)+“fourthFun”;
函数initFun(initValue){
let函数=[
[firstFun],
[Second Fun,“额外参数”],
[Thirdfun],
[fourthFun,“我也在这里”],
];
返回函数.reduce((结果,[fn,…args])=>fn(结果,…args),initValue);
}

log('result:'+initFun('foobar'))我猜您正在寻找函数组合:我们可以使用JavaScript中的函数数组构建复合函数,例如使用
reduce
(初始值为标识函数
(v)=>v

const composell=(functions)=>functions.reduce(
(组成,f)=>
((v)=>f(组成(v)),
(v) =>v
);
const firstFun=(s)=>`s}a`;
const secondFun=(s)=>`s}b`;
常量thirdFun=(s)=>`s}c`;
const fourthFun=(s)=>`s}d`;
const intiFun=composell([firstFun,secondFun,thirdFun,fourthFun]);
console.log(intiFun(“”));
错误的方法-请参见下文 如果需要类似于
a.firstFunc().secondFunc().thirdFunc().fourthFunc()
,则应将这些函数定义为
对象.prototype
(或
编号.prototype
字符串.prototype
等):

p.S.“函数”通常被缩短为“func”,但不是“fun”


使现代化 如果您想要类似于
myObject(a).firstFunc().secondFunc().thirdFunc().fourthFunc()
,您应该:

var myObject = function(value) {
    this.value = value;
};
myObject.prototype.firstFunc = function() {
    var value = this.value;
    // ...
    return something;
};
myObject.prototype.secondFunc = function() {
    var value = this.value;
    // ...
    return something;
};
myObject.prototype.thirdFunc = function() {
    var value = this.value;
    // ...
    return something;
};
myObject.prototype.fourthFunc = function() {
    var value = this.value;
    // ...
    return something;
};

管道
,手动清洗和部分应用于救援:

constpipe=funs=>x=>
funs.reduce((o,fun)=>fun(o,x)
常数f=x=>x+1
常数g=x=>y=>x+y*2
常数h=x=>x*x
常数i=x=>y=>z=>x+y/z+3
常数j=x=>x+5
const init=管道([
F
,g(4)
H
,i(10)(33)
J
])
常量输入=1
常量输出=初始(输入)

console.log(output)
“我不想将每个函数的值保存为变量”-这是一个您将从中受益的愿望。用这种方式编写它(a)非常清楚,(b)添加日志调试语句非常容易。对你来说,调试非常容易。但是出于好奇,我想知道有什么方法可以做到这一点?如果你想要链接,你需要创建一个构造函数,然后添加实例函数,并在这些函数中返回实例。nx,i thing,i应该保留旧的登录。每个解决方案都可以做到这一点复杂化你真的应该接受一个答案。:)我知道,但一个月后它很难阅读和理解,并承诺它是一个很好的解决方案,tnx。但我的功能必须是同步而不是a-sync。也许在其他情况下我可以用它;)+第一个代码段为1,第二个代码段为1。滥用承诺作为身份容器是一个可怕的想法。使用部分应用程序,您不必传递额外的参数。您可以改为编写
const initFun=initValue=>[firstFun,secondFun.bind(null,“额外参数”),thirdFun,fourthFun.bind(null,“我也在这里”)].reduce((x,f)=>f(x),initValue)。如果使用了
secondFun
fourthFun
,那么您甚至不必使用
.bind
。这是一个糟糕的建议。不要在本机原型上定义方法,除非您正在进行猴子补丁。
const firstFun  = x => { /* return ... */ };
const secondFun = x => { /* return ... */ };
const thirdFun  = x => { /* return ... */ };
const fourthFun = x => { /* return ... */ };

const callAll= (value, ...functions) => {
   functions.forEach(fn => value = fn(value));
   retrun value;
}

const result = callAll(3, firstFun, secondFun, thirdFun, fourthFun);

console.log(result);