Deje observables emiten primera "status" de esperar a que los anteriores para completar

votos
1

quiero lograr lo siguiente: Tengo varios pasos en una inicialización, donde cada paso es un observable. Cada paso debe actualizar su estado a través de un lado () llamada, cuyo contenido se muestra en una plantilla angular.

Ellos deben ser ejecutadas en orden secuencial, ya que cada pasos se basa en el paso anterior.

El problema es que todas las medidas deben tener un estado inicial, de manera que el usuario pueda ver al menos todas las medidas, incluso si los observables no están suscritos a todavía.

Hay una manera de lograr esto ? O necesito para separar lo observable a partir de los datos que se muestran y cambiar los datos en cada lado () llamar?

Editar: Puesto que parece difícil de entender lo que quiero lograr Trato de explicarlo como un ejemplo: Mi inicialización tiene 3 pasos. Grupo 1 , Grupo 2 , Grupo 3 . Para cada tarea una fila en la html se muestra con la descripción de la tarea y el estado (por ejemplo en curso o completa ). La descripción de cada tarea debe por supuesto ser visible desde el principio, incluso si algunas de las tareas aún no han sido inscritos. Tan pronto como la tarea anterior ha terminado, la siguiente tarea debe comenzar. La actualización a la tarea debe ser entregado a través de la siguiente () llamada en cada observable.

Edit2: Aquí hay un código con una solución 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 es la única manera que he encontrado hasta ahora. ¿Hay una mejor manera de manejar la ejecución de las tareas? concat parece que no funciona ya que necesitan tener acceso a toda la tarea objeto en el siguiente () llamada de la suscripción, por eso es necesario para recorrer manualmente cada uno y esperar con una promesa.

Publicado el 19/09/2018 a las 12:59
fuente por usuario
En otros idiomas...                            

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