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);