如何确保执行功能以进一步委派进程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (49)

我在JS中有一些函数,应该按顺序执行。其中一个可以返回值(sync),其他没有,或者可以返回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); });
        }
    }
}
提问于
用户回答回答于

您可以创建一个函数,逐个递归地调用给定的函数,如下所示:

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

扫码关注云+社区

领取腾讯云代金券