首页 > 解决方案 > 如何确保执行该功能以进一步委托流程?

问题描述

我在 JS 中有一些函数,应该按顺序执行。其中一个可以返回值(同步),其他没有,或者可以返回 Observable 结果(异步)。

那么,如何确保执行任何函数并将委托执行进一步传递给下一个函数?

当然,我可以为每个函数使用回调或将彼此包装到 Promise。

例如:

 function one() {
     return 1;
 }

 function two(r1) {
     return 2;
 }

 function three(r2): void {

 }

 function fourObs(r3): Observable<any> {
     return new Observable();
 }

所以,我需要以下调用堆栈:

r1 = one();

if (r1) {
    r2 = two(r1);

    if (r2) {
        r3 = three(r2);

        if (r3) {
            fourObs(r3).subscribe({(data) => console.log(data); });
        }
    }
}

标签: javascript

解决方案


您可以创建一个函数,它像这样递归地调用给定的函数:

// Helper fn
const logArg = val => console.log(`Previous value ${val}`);
const logName = fn => console.log(`Fn ${fn.name.replace('bound ', '')} called`);

// Fn a returns Boolean
const a = () => true;
// Fn b returns Void (undefined)
const b = previousResult => { logArg(previousResult); };
// Fn c returns Promise<Number>
const c = previousResult => new Promise(resolve => {
  logArg(previousResult);
  resolve(10);
});
// Fn d returns String - but is called last so the result isn't passed anywhere
const d = previousResult => {
  logArg(previousResult);
  return '10';
};

function runInSequence (...fns) {
  const fn = fns[0];
  const result = fn();
  
  logName(fn);
  
  if (fns.length === 1) {
    return;
  } else if (result instanceof Promise) {
    // If function returns a Promise, wait for it to be resolved
    result.then(value => runInSequence(
      fns[1].bind(null, value),
      ...fns.slice(2),
    ));
  } else {
    // Otherwise just continue
    runInSequence(
      fns[1].bind(null, result),
      ...fns.slice(2),
    );
  }
}

runInSequence(
  a,
  b,
  c,
  d,
);


推荐阅读