你可以利用
scan
action$.pipe(
of(actions.REQUEST_A, actions.REQUEST_B, actions.EPIC_A_END, actions.EPIC_B_END),
scan(({queue}, current) => {
if (current is epic end action)
if (queue is not empty) {
return { queue: queue.slice(1), triggerEpic: EPIC_A_START or EPIC_B_START depending on queue[0] }
}
else {
return { queue, triggerEpic: null };
}
}
else {
if (queue is not empty) {
return { queue: [...queue, current], triggerEpic: null };
}
else {
return { queue: [], triggerEpic: EPIC_A_START or EPIC_B_START depending on current };
}
}
}, { queue: [], triggerEpic: null }),
filter(x => x.triggerEpic !== null),
map(x => x.triggerEpic)
)