javascript - 如何确保执行该功能以进一步委托流程?
问题描述
我在 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); });
}
}
}
解决方案
您可以创建一个函数,它像这样递归地调用给定的函数:
// 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,
);
推荐阅读
- c# - NET C# 控制台应用程序未正确检测按键
- node.js - Angular 和 NodeJs 应用程序,在获取 url 链接时抛出错误 SyntaxError: Unexpected token � in JSON at JSON.parse 的位置 0
- javascript - CORS 随处读取旧文件
- installation - Raku - 程序如何验证模块是否安装在本地
- azure - 已解决 - 无法在独立区域路径 Azure DevOps 之间移动
- vue.js - 如何将 localIdentName 添加到 vue 项目的 webpack 配置中
- javascript - 如何使用发布请求更改文本?(角度)
- python - 用 $ 打印它,如使用 python 格式所示
- swiftui - SwiftUI 从 UIKit 获取数据到 SwiftUI
- java - 使用 Sping Boot 的 Power BI SSO