Vamos observáveis ​​emitem primeiro "status" de esperar que os anteriores para completar

votos
1

eu quero alcançar o seguinte: Eu tenho vários passos em uma inicialização, onde cada passo é um observável. Cada passo deve atualizar seu status através de um next () chamada, que o conteúdo é exibido em um modelo angular.

Eles devem ser executadas em ordem seqüencial uma vez que cada passos confia na etapa anterior.

O problema é que todas as medidas devem ter um status inicial, de modo que o usuário pode, pelo menos, ver todas as etapas, mesmo se eles observáveis ​​não está inscrito ainda.

Existe uma maneira de conseguir isso ? Ou eu preciso fazer para separar o observável a partir dos dados apresentados e alterar os dados em cada lado () chamar?

Edit: Uma vez que parece difícil entender o que eu quero alcançar i tentar explicá-lo como um exemplo: Meu inicialização tem 3 etapas. A tarefa 1 , tarefa 2 , tarefa 3 . Para cada tarefa uma linha no html é exibido com a descrição da tarefa e o status (por exemplo, em andamento ou completo ). A descrição de cada tarefa deve ser, obviamente, visível desde o início, mesmo se algumas tarefas ainda não está inscrito. Assim que a tarefa anterior é concluída, a próxima tarefa deve começar. A atualização para a tarefa deve ser entregue através da next () chamada em cada observável.

Edit2: Aqui está um código com uma solução básica:

// 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);
    });
}

Esta é a única maneira que eu encontrei até agora. Existe uma maneira melhor de lidar com a execução das tarefas? concat parece não funcionar, pois eu preciso ter acesso a toda a Task objeto no next () chamada da assinatura, assim que eu preciso para iterar manualmente cada um e esperar com uma promessa.

Publicado 19/09/2018 em 12:59
fonte usuário
Em outras línguas...                            

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