typescript - Hämta en enskild medlem från en array från en rxJS-observable


Om jag har en array-klass som denna:

export class DashboardComponent {
    people$: Observable<Person[]>;
    selectedPerson$: Observable<Person>;
    constructor(selectedPersonId){
         this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source

         // How to then selected the selected person from the array this.people???
    }
}

Hur går jag tillväga för att ta en Observable<Person[]> och sedan välja personen till en Observable (eller bara det råa värdet, beroende på vad som är rätt att göra).

Svar #1

Din fråga är lite otydlig, därför ett något generiskt svar:

När du prenumererar på en observable som skickar ut arrayer, så är det ingen skillnad om du får den arrayen från en observable eller inte (åtminstone efter att du faktiskt har fått den).

För att få den första personen, prenumerera på observabeln och bara åtkomst till det första elementet i arrayen som

getSomeObservableArrayOfPeople().subscribe(data => this.person = data[0]);

Om den observerbara inte sänder ut en array av människor utan en sekvens av händelser av människor kan du använda operatörer som

getSomeObservableOfPeople().skip(3).take(1).subscribe(data => this.person = person);

Detta tar bara den fjärde personen och ignorerar alla andra.

Tips: operatorer som skip och take måste importeras uttryckligen för att vara tillgängliga.

För observables som sänder en sekvens av personevenemang som antas i exemplet ovan, kan denna sekvens samlas till en array med hjälp av scan-operatorn:

getSomeObservableOfPeople().scan(3).subscribe(data => {
  if(data.length >= 3) {
    this.person = data[2];
  }
})

Varje gång en ny person skickas ut, anropas callback-funktionen som skickats till subscribe med arrayen där personerna som skickats ut av tidigare händelser kombineras med personen som skickats ut av den senaste händelsen.

Svar #2

Efter att ha åkt iväg och kommit tillbaka tror jag att en del av min förvirring var att jag inte förstod vad observablerna faktiskt var och hur det fungerade.

Det jag försökte göra är värdet av en array i en observabel så att jag kunde få tillbaka en annan observabel som har värdet av den valda personen. Den kompletta (semi-sudo kod) skulle vara som följer:

import * as _ from 'lodash';

export class DashboardComponent {
    people$: Observable<Person[]>;
    selectedPerson$: Observable<Person>;
    constructor(selectedPersonId){
        this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source
        this.selectedPerson$ = this.people$.map((people) => this.getSelectedPerson(selectedPersonId, people));

    }    
    getSelectedPerson(selectedPersonId, people){
        if(!(state || people.length == 0)) return null;    
        return _.find(people, function(r: Person) { return r.id === selectedPersonId; });
    }
}

Relaterade artiklar