Sun*_*nny 19 javascript node.js
我有一系列函数,如:
funcArray = [func1, func2, func3];
Run Code Online (Sandbox Code Playgroud)
在给定函数中,我想执行数组中的下一个函数.我该怎么做呢?这是我的基本骨架:
function func1() {
// I get current function caller
var currentFunc = func1.caller;
// I want to execute the next function. Happens to be func2 in the example.
}
Run Code Online (Sandbox Code Playgroud)
我不能使用indexOf
函数,就像字符串或数字的数组一样.
注意:此问题似乎与此及其所指的类似.但是,这是一个不同的问题.
我想通过修改数组来改变处理顺序.这就是目标.可能会更有效的方法.
澄清:根据一些评论:funcArray是全球性的.
目标是在不使用任何第三方模块的情况下,以尽可能简单有效的方式为Node.js HTTP模块实现中间件.
T.J*_*der 33
除非func1
结束funcArray
,否则你不能伸手去寻找func2
并执行它,你也不应该.即使func1
确实关闭了funcArray
,也不会将关注点分离func1
出来,以便找到自己funcArray
然后执行func2
.
相反,有其他代码负责运行这些功能.
如果函数同步完成它们的工作,那么它只是:
funcArray.forEach(fn => fn());
Run Code Online (Sandbox Code Playgroud)
要么
for (const fn of funcArray) {
fn();
}
Run Code Online (Sandbox Code Playgroud)
或者如果一个函数的结果应该传递给下一个,你可以使用reduce
:
const finalResult = funcArray.reduce((previousResult, fn) => fn(previousResult), undefined);
Run Code Online (Sandbox Code Playgroud)
... undefined
传递给的值在哪里func1
.
如果他们不同步工作,您需要为他们提供一种方式来通知他们的来电者他们已经完成了他们的工作.Promise是一种很好的标准方法,但你可以使用简单的回调.
例如,如果你让它们返回承诺,你可以使用旧的承诺reduce
技巧:
funcArray.reduce((p, fn) => {
return p.then(() => {
fn();
});
}, Promise.resolve());
Run Code Online (Sandbox Code Playgroud)
或者如果一个函数的结果应传递给下一个函数:
funcArray.reduce((p, fn) => {
return p.then(fn);
}, Promise.resolve());
Run Code Online (Sandbox Code Playgroud)
你可以提供一个参数来Promise.resolve
设置要传递给的值func1
(没有一个,它会收到undefined
).