在JavaScript中,如何从函数数组中执行下一个函数

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

  • 我认为值得一提的是'Promise.all`.这不是这个问题的答案,但对于那些只想按任意顺序运行所有功能并在完成时做某事的人来说,这很好. (2认同)