我知道expand
会在rxjs中实现递归。我已经找到了许多有关如何实现简单递归的示例,但是对于相互递归而言却没有。
基本上,我需要维护一个最新的结果列表。该列表通过groom$
函数进行过滤,并通过fetch$()
函数进行更新/扩展,每个函数都交替调用。
我使用状态机进行了第一个实现(传递下一个操作以调用expand
),但是我想知道是否有更好的方法使用rxjs进行相互递归。
这是示例代码:
const { of, timer, throwError } = Rx;
const { expand, switchMap, map, concat } = RxOperators;
function groom$(arr) {
return timer(1000).pipe(map(() => arr.slice(1)));
}
function fetch$(arr) {
return timer(250).pipe(map(() => [...arr, arr.slice(-1)[0] + 1]));
}
function multiRecurse(initialState, firstOp, transitions) {
return firstOp(initialState).pipe(
map((data) => ({data, op: transitions[firstOp]})),
expand(({data, op}) => {
if (transitions[op]) {
return op(data).pipe(map((data) => ({data, op: transitions[op]})));
} else return throwError(`Unknown next operation: ${op}`);
}),
map(({data}) => data)
);
}
multiRecurse([0], fetch$, {
[groom$]: fetch$,
[fetch$]: groom$
});
生成的大理石图(来自https://rxviz.com/v/XJzlBj2o):