Laissez Observables émette premier « statut » que d'attendre que les précédentes pour compléter

voix
1

je veux atteindre les objectifs suivants: J'ai plusieurs étapes dans une initialisation, où chaque étape est observable. Chaque étape doit mettre à jour son statut via un autre () appel, dont le contenu est affiché dans un modèle angulaire.

Ils doivent être exécutées dans un ordre séquentiel depuis chaque étape repose sur l'étape précédente.

Le problème est que toutes les mesures devraient avoir un statut initial, de sorte que l'utilisateur peut au moins voir toutes les étapes même si elles ne sont pas souscrites OBSERVABLES encore.

Y at - il un moyen d'y parvenir? Ou ai-je besoin de séparer l'observable à partir des données affichées et que les données changent sur chaque côté () appeler?

Edit: Comme il semble difficile de comprendre ce que je veux réaliser j'essayer de l' expliquer comme un exemple: Mon initialisation a 3 étapes. Groupe 1 , Groupe 2 , Groupe 3 . Pour chaque tâche une ligne dans le code HTML est affiché avec la description de la tâche et le statut (par exemple en cours ou complet ). La description de chaque tâche doit évidemment être visible dès le début , même si certaines tâches ne sont pas encore abonné. Dès que la tâche précédente est terminée, la tâche suivante devrait commencer. La mise à jour à la tâche devrait être délivré par le suivant () appel dans chaque Observable.

Edit2: Voici une partie avec une solution de base:

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

Ceci est la seule façon que j'ai trouvé jusqu'à présent. Y at - il une meilleure façon de gérer l'exécution des tâches? concat semble fonctionne pas car je dois avoir accès à l'ensemble des tâches objet dans le prochain () appel de l'abonnement, donc j'ai besoin itérer manuellement chacun et attendre avec une promesse.

Créé 19/09/2018 à 12:59
source utilisateur
Dans d'autres langues...                            

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