Я хочу добиться следующего: у меня есть несколько шагов в инициализации, где каждый шаг является наблюдаемым.Каждый шаг должен обновлять свое состояние с помощью вызова next () , содержимое которого отображается в угловом шаблоне.
Они должны выполняться в последовательном порядке, поскольку каждый шаг основан на предыдущем шаге.
Проблема заключается в том, что все шаги должны иметь начальный статус, чтобы пользователь мог по крайней мере увидеть все шаги, даже если на его наблюдаемые еще не подписаны.
Есть ли способ достичь этого?Или мне нужно отделить наблюдаемое от отображаемых данных и изменять эти данные при каждом следующем () вызове?
Редактировать: поскольку мне кажется трудным понять, чего я хочу достичь, я пытаюсьчтобы объяснить это в качестве примера: моя инициализация состоит из 3 шагов. Задача 1 , Задача 2 , Задача 3 .Для каждой задачи в html-файле отображается строка с описанием задачи и ее статусом (например, в процессе или complete ).Конечно, описание каждой задачи должно быть видно с самого начала, даже если на некоторые задачи еще не подписаны.Как только предыдущее задание будет завершено, должно начаться следующее задание.Обновление задачи должно быть доставлено с помощью вызова next () в каждом Observable.
Edit2: Вот некоторый код с базовым решением:
// This is how a basic task should look like
interface Task {
description: string,
progressMessage: string,
status: 'running' | 'idle' | 'complete',
children: Task[],
task: Observable<TaskStatus>
}
// This should be the format of each next call
interface TaskStatus {
progressMessage?: string,
status?: 'running' | 'idle' | 'complete'
}
// Wait for each task, on complete run next one, is there a better way ?
private async runTasks(): Promise<void> {
for (let task of this.tasks) {
await new Promise((resolve, reject) => {
task.task.subscribe({
next: (taskStatus: TaskStatus) => {
if (taskStatus.status) {
task.status = taskStatus.status;
}
if (taskStatus.progressMessage) {
task.progressMessage = taskStatus.progressMessage;
}
},
error: (error: Error) => {
console.log(error);
reject(error);
},
complete: () => resolve()
});
});
}
}
private registerNewTask(description: string, taskFactory: () => Observable<TaskStatus>): void {
const taskObservable: Observable<TaskStatus> = taskFactory();
const newTask: Task = {
description: description,
progressMessage: '',
status: 'idle',
children: [],
task: taskObservable
};
this.tasks.push(newTask);
}
private task1(): Observable<TaskStatus> {
return Observable.create((observer: Observer<TaskStatus>) => {
observer.next({ progressMessage: 'Started', status: 'running' });
setTimeout(() => {
observer.next({ progressMessage: 'Finished', status: 'complete' });
observer.complete();
}, 10000);
});
}
private task2(): Observable<TaskStatus> {
return Observable.create((observer: Observer<TaskStatus>) => {
observer.next({ progressMessage: 'Started', status: 'running' });
setTimeout(() => {
observer.next({ progressMessage: 'Finished', status: 'complete' });
observer.complete()
}, 10000);
});
}
Это единственный способ, который я нашел до сих пор.Есть ли лучший способ справиться с выполнением задач? concat , кажется, не работает, так как мне нужно иметь доступ ко всему объекту Task в вызове next () подписки, поэтому мне нужно вручную выполнять итерацию каждогоодин и ждать с обещанием.