La observer avgir første "status" enn å vente for foregående for å fullføre

stemmer
1

jeg ønsker å oppnå følgende: Jeg har flere trinn i en initialisering, der hvert trinn er en observerbar. Hvert trinn skal oppdatere sin status via en neste () samtalen, som innholdet vises i en vinkel mal.

De bør bli utført i rekkefølge ettersom hvert trinn bygger på trinnet før.

Problemet er at alle trinn skal ha en innledende status, slik at brukeren kan i det minste se alle trinnene selv om de observer abonnerer ikke på ennå.

Er det en måte å oppnå dette? Eller trenger jeg å skille observerbar fra de viste data og endre disse dataene på hver neste () kaller?

Edit: Siden det synes vanskelig å forstå hva jeg ønsker å oppnå jeg prøver å forklare det som et eksempel: Min initialisering har 3 trinn. Oppgave 1 , oppgave 2 , oppgave 3 . For hver oppgave en rad i html vises til beskrivelsen av oppgaven og status (for eksempel pågår eller fullstendig ). Beskrivelsen av hver oppgave bør selvfølgelig være synlig helt fra begynnelsen, selv om noen oppgaver ennå ikke abonnerer på. Så snart den forrige oppgaven er ferdig, skal den neste oppgaven starter. Oppdateringen til oppgaven skal leveres via next () kall i hver observerbar.

Edit2: Her er noen kode med en grunnleggende løsning:

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

Dette er den eneste måten jeg fant til nå. Finnes det en bedre måte å håndtere gjennomføringen av oppgavene? concat synes ikke siden jeg må ha tilgang til hele Task objektet i neste () kallet av abonnement, så jeg trenger å gjenta hver enkelt manuelt og vente med et løfte.

Publisert på 19/09/2018 klokken 12:59
kilden bruker
På andre språk...                            

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