【发布时间】:2020-11-22 03:37:18
【问题描述】:
这里是 3 个典型步骤组的场景
- 准备工作
- 检索数据
- 清理工作
我正在寻找处理这些设置在数组中的步骤的最佳安排(见下文)。
条件:
-
重要提示:前两个步骤组必须可以在任何时间点/任何时间被事件或主题或类似取消 (例如,由用户点击触发)。
-
如果触发了取消/停止,仍然需要运行第 3 组的步骤来进行清理工作
-
1.准备工作:
-
1.1。这组1的动作步骤必须一个一个地执行
-
1.2。除非取消,否则所有步骤都会执行
-
1.3。 (可以以任何方式编码 - 作为函数、Observable、Promise 等)
-
2。检索数据
-
2.1。准备工作后执行步骤(一)
-
2.2。此步骤使用 API,其返回数据为:Promise
-
2.3。结果数据立即返回给调用者/订阅者(不等待清理工作)
-
2.4。返回的结果必须再次为:Promise
-
3.清理工作
-
3.1。在第 2 步之后开始
-
3.2。可以异步/随时/稍后运行,但在第 1 步和第 2 步之后
-
3.3。第3组的步骤必须一个一个地执行
-
3.4。 (可以以任何方式编码 - 作为函数、Observable、Promise 等)
这是我需要修改的框架代码,尤其是方法内的代码:
handleDataRequest()
import { Injectable } from '@nestjs/common';
import { from, Subject } from 'rxjs';
import { filter, map, switchMap, mergeMap,subscribeOn, take, takeUntil, } from 'rxjs/operators';
export interface ActionStep {
id: string,
taskGroup: number // 1 = Prep.Work, 2 = Data, 3 = Cleanup
// etc.
}
export const ActionSteps: ActionStep[] = [
{ id: 'PrepWork1', taskGroup: 1 },
{ id: 'PrepWork2', taskGroup: 1 },
{ id: 'PrepWork3', taskGroup: 1 },
{ id: 'Data', taskGroup: 2 },
{ id: 'Cleanup1', taskGroup: 3 },
{ id: 'Cleanup2', taskGroup: 3 },
]
@Injectable()
export class DataRequestService<T> {
public requestCanceled$: Subject<boolean>;
handleDataRequest(actionSteps: ActionStep[]): Promise<T[]> {
const actionSteps$ = from(actionSteps);
actionSteps$.pipe(
filter(step => step.taskGroup === 1), // 1 = Prep.Work
takeUntil(this.requestCanceled$),
map((step: ActionStep,) => this.prepWork(step)));
const result = actionSteps$.pipe(
filter(step => step.taskGroup === 2), // 2 = Data
takeUntil(this.requestCanceled$),
map((step: ActionStep) => this.getData(step)));
actionSteps$.pipe(
filter(step => step.taskGroup === 3), // 3 = Cleanup
map((step: ActionStep,) => this.cleanupWork(step)));
return result;
}
private prepWork(param) {
// doing prep. work ...
}
private getData<T>(param): Promise<T[]> {
let data: Promise<T[]>;
// getting data ...
return data;
}
private cleanupWork(param) {
// doing cleanup ...
}
}
【问题讨论】: