2017-01-16 1 views
4

J'ai un seul service, qui renvoie un seul observable. Maintenant, je cherche la manière correcte/la plus efficace d'obtenir plusieurs résultats de cet Observable sans écrire trop de code.Angular2 + pipe asynchrone: Obtenir plusieurs valeurs d'un seul observale

  • MyService renvoie un Observable<Array<Foo>>

  • MyComponent appels myService.getFoos() et doit fournir en sortie les 5 premiers éléments de la matrice, et la longueur totale de la matrice, et le nombre d'éléments non représentés.

Voici mon code actuel:

@Injectable() 
export class MyService { 
    foos = new BehaviorSubject<Array<Foo>>([]); 

    getFoos() { 
    return this.foos.asObservable(); 
    } 
} 



@Component({ 
    template: ` 
    Total: {{ totalCount | async }} 
    Omitted: {{ (totalCount | async) - (maxFiveItems | async).length }} 
    <div *ngFor="let item of maxFiveItems | async"> 
     {{item.bar}} 
    </div> 
    ` 
}) 
export class MyComponent { 
    totalCount: Observable<number>; 
    maxFiveItems: Observable<Array<Foo>>; 

    constructor(myService:MyService) { 
    this.totalCount = myService.getFoos() 
     .map(arr => arr.length); 

    this.maxFiveItems = myService.getFoos() 
     .map(arr => arr.slice(0, 5)); 
    } 
} 

Le résultat a l'air bien, mais je suis en utilisant le tuyau async 4 fois. Lequel (pour autant que je sache) entraînera 4 abonnements. Cela ne devrait pas être nécessaire à tout ce que je suppose que (?)


Bien sûr, je pourrais souscrire manuellement dans le constructor de MyComponent puis vivre sans async tuyaux. Mais alors je dois prendre soin de me désinscrire moi-même.

Existe-t-il un autre moyen de gérer cela?

Répondre

4

Il n'y a rien de mal à ce que vous faites en supposant que myService.getFoos() quelque part à l'intérieur utilise l'opérateur share() donc tous vos tubes async partagent le même abonnement à la source. Si vous utilisez BehaviorSubject comme dans cet exemple, alors tout va bien. Ce que vous avez mentionné au sujet de votre abonnement dans le constructeur est ce qui m'est immédiatement venu à l'esprit. Je ne vois pas de désinscription manuelle comme problème.

+0

Je ne comprends pas pourquoi vous devriez utiliser 'share' sur un' BehaviorSubject'. En ce qui concerne la désabonnement, si vous vous abonnez manuellement à quelque chose qui peut émettre plus d'une valeur (c'est le cas pour un sujet de comportement), vous devez vous désabonner. Sinon, vous obtenez une fuite de mémoire. Fondamentalement, vous devriez implémenter l'interface 'OnDestroy' dans votre composant. – Melou

+0

Appart de cela, je suis d'accord avec vous: approche @Benjamin semble parfaitement bien. – Melou

+1

Je viens de lire à propos d'une prochaine fonctionnalité dans Angular 4: ** ngIf avec tuyau async et let ** (voir: https://netbasal.com/a-taste-from-angular-version-4-50be1c4f3550). Cela pourrait résoudre certains de ces scénarios d'abonnement multiple. –