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

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

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

我在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,
);

热门问答

TSF微服务无法查看JVM监控,显示空白?

工口Miku说唱歌手
推荐
回答来自于问答智囊团成员:邓愉悦 专栏:https://cloud.tencent.com/developer/user/6835587 原因分析 1、tsf-agent 版本过低。 使用 JVM 监控功能时,实例的 tsf-agent 需为 1.21.0 ...... 展开详请

直播推流失败,什么原因导致的呢?

青蛙克星哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
推荐
回答来自于问答智囊团成员:clairehou 专栏:https://cloud.tencent.com/developer/column/89786 经常会收到客户咨询,直播推流失败是什么原因导致。从云直播使用步骤上来讲,直播推流作为第一步,如果推流失败,后续的转码、录制、播放等...... 展开详请

视频播着播着就卡住了,什么原因造成的呢?

推荐
回答来自于问答智囊团成员:bellchen 专栏:https://cloud.tencent.com/developer/article/1734074 猜想 导致视频播放卡顿的原因有千千万万,常见的有如下: 1、网络较差,导致视频下载较慢,需要缓冲,因此卡住了; 可以下载文件到...... 展开详请

云通信图片语音消息发送失败,错误码70402?

宅女have fun……
推荐
回答来自于问答智囊团成员:linpeiyang@云通信 专栏:https://cloud.tencent.com/developer/article/1750251 客户提到文字信息没有失败,说明消息上行到云通信IM后台 -> 云通信IM后台处理 -> 云通信IM后台下发消息给用...... 展开详请

即时通信如何像QQ一样实现加好友、备注、进行好友分组?

五星格兰特就事论事不撕逼!三观不合删评价!
推荐
回答来自于问答智囊团成员:linpeiyang@云通信 专栏:https://cloud.tencent.com/developer/article/1750251 即时通信IM默认有2种关系链 好友 黑名单 均可以通过以下两种方式实现增删改查的功能: 调用REST API 调用...... 展开详请

CPU负载100%,但并看不到具体哪个进程导致的,?

鸿鹄认真生活 做出美好的产品 App/VR/美国市场
推荐
回答来自于问答智囊团成员:何刚 专栏:https://cloud.tencent.com/developer/user/6827370 安全分析 1、隐藏进程 经过busybox核实到存在隐藏进程,百度核实为挖矿病毒 📷 2、crontab 存在异常任务 📷 下载链接已经失效,I...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券