Пусть Наблюдаемые испускают первый «статус», чем ждать, пока предыдущие закончить

голоса
1

я хочу , чтобы достичь следующего: У меня есть несколько шагов инициализации, где каждый шаг является наблюдаемым. Каждый шаг должен обновить свой статус через следующий () вызов, содержание которого отображается в угловом шаблоне.

Они должны быть выполнены в последовательном порядке, поскольку каждый из шагов зависят от предыдущего шага.

Проблема заключается в том, что все шаги должны иметь первоначальное состояние, так что пользователь может видеть, по крайней мере, все шаги, даже если они Наблюдаемые не подписаны пока.

Есть ли способ для достижения этой цели? Или мне нужно отделить наблюдаемые от отображаемых данных и изменить эти данные на каждом следующем () позвонить?

Edit: Так как кажется , трудно понять , что я хочу достичь я пытаюсь объяснить это как пример: Моя инициализация имеет 3 шага. Задача 1 , Задача 2 , Задача 3 . Для каждой задачи строка в HTML отображается с описанием задачи и состояния (например , в ходе или в комплекте ). Описание каждой задачи , конечно , должны быть видны с самого начала , даже если некоторые задачи еще не подписаны. Как только предыдущая задача завершена, следующая задача должна начаться. Обновление задачи должны быть доставлены по следующему () вызова в каждом 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 , похоже , не работает , так как мне нужно , чтобы иметь доступ ко всей целевой объект в следующем () вызова подписки, поэтому мне нужно вручную перебирать каждый из них и ждать с обещанием.

Задан 19/09/2018 в 12:59
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more