angular - Prenumerera på flera observable<boolean> i en foreach-loop?


Jag har en komponent med en frågelista över underliggande komponenter. Var och en av dessa underkomponenter exponerar två metoder, en som returnerar om ett formulär är giltigt som en observable<boolean>, och en annan som returnerar ett objekt.

I föräldrakomponenten vill jag loopa igenom barnkomponenterna och kolla att varje barn är giltigt. Jag har kod som detta

    let valid: boolean = true;
    children.forEach(r => {
       r.validate().subscribe(v => {
          if(!v){
             valid = v;
             }
          });    
       });

Det fortsätter sedan med att samla objekten om 'valid' fortfarande är sant efter foreach-loopen. Jag föreställer mig dock att detta inte är korrekt, eftersom det är möjligt att foreach-loopen kan slutföras innan alla observables har skickat ett värde. Jag är också osäker på effekten av att tilldela flera prenumerationer till samma variabel.

Finns det ett bättre sätt att göra detta på, förutom att helt enkelt få validate()-metoden att returnera ett vanligt boolean-värde? Skulle något som en forkjoin vara bättre, där foreach-loopen bara delar upp alla observables tillsammans och avger en enda array?

Svar #1

Du kan använda forkJoin.

När alla observabler slutförs, sänd den sista emitterade värdet från varje.

import { forkJoin } from 'rxjs/observable/forkJoin';

const allObs = forkJoin(...children.map(r => r.validate()));
allObs.subscribe(res => console.log(res)); // Do what you want with the array of results

Relaterade artiklar