我在JS中有一些函数,应该按顺序执行。其中一个可以返回值(sync),其他可以不返回值,或者可以返回可观察的结果(async)。
那么,如何确保任何函数被执行,并将委托执行进一步传递到下一个函数?
当然,我可以为每个函数使用回调,也可以相互包装来承诺。
As实例:
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); });
}
}
}
发布于 2019-02-27 23:29:15
您可以创建一个函数,逐个递归调用给定的函数,如下所示:
// 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,
);
https://stackoverflow.com/questions/54908631
复制相似问题