web-dev-qa-db-fra.com

Observable.forkJoin et argument de tableau

Dans la documentation forkJoin d'Observables, il est indiqué que les arguments peuvent être un tableau, mais aucun exemple ne le mentionne:

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

J'ai essayé une fonction similaire à celle que j'ai listée (ci-dessous) mais avec une erreur:

:3000/angular2/src/platform/browser/browser_adapter.js:76 

EXCEPTION: TypeError: Observable_1.Observable.forkJoin is not a function

Une version cisaillée de ma fonction ci-dessous:

processStuff( inputObject ) {
  let _self = this;

  return new Observable(function(observer) {
    let observableBatch = [];

    inputObject.forEach(function(componentarray, key) {
      observableBatch.Push(_self.http.get(key + '.json').map((res: Response) => res.json()));
    });

    Observable.forkJoin(
      observableBatch
    // );
    ).subscribe(() => {
      observer.next();
      observer.complete();
    });

  });
}

La racine de ma question est liée à la fin d'une boucle avant de procéder comme indiqué ici: Angular2 Observable - comment attendre que tous les appels de fonction d'une boucle se terminent avant de continuer?

Mais je n'ai pas complètement maîtrisé l'utilisation correcte de forkJoin avec un tableau et la bonne syntaxe pour le faire.

Je suis très reconnaissant de l'aide que vous pourriez offrir.

NOTE: EXEMPLE DE TROISIEME FONCTION QUI RENVOIE UN OBSERVABLE

thirdFunction() {
  let _self = this;

  return Observable.create((observer) => {
  // return new Observable(function(observer) {
    ...

    observer.next(responseargs);
    observer.complete();
  });
}

processStuff(inputObject) {
  let _self = this;
  let observableBatch = [];

  inputObject.forEach((componentarray, key) => {
    observableBatch.Push(_self.thirdFunction().map((res: Response) => res.json()));
  });

  return Observable.forkJoin(observableBatch);
}

elsewhere() {
  this.processStuff(inputObject)
    .subscribe()
}
38
Benjamin McFerren

Vous devez importer des opérateurs qui ne sont pas chargés par défaut. C'est ce que EXCEPTION Observable.xxxx is not a function Signifie habituellement. Vous pouvez soit importer tous les opérateurs en ajoutant rxjs complet à votre bootstrap, par exemple:

import 'rxjs/Rx'

ou en important des opérateurs spécifiques, dans votre cas:

import 'rxjs/add/observable/forkJoin'

Autre observation/suggestion à propos de votre code: essayez de vous en tenir à une syntaxe. Vous mélangez es5, es6, TypeScript ... et tant qu’il fonctionnera, cela ne vous confondra que sur le long terme. De plus, si vous ne faites que commencer avec Observables, essayez d'éviter new Observable() et utilisez plutôt des opérateurs de création;

processStuff( inputObject ) {
  let observableBatch = [];

  inputObject.forEach(( componentarray, key ) => {
    observableBatch.Push( this.http.get( key + '.json').map((res: Response) => res.json()) );
  });

  return Observable.forkJoin(observableBatch);
}

elsewhere() {
  this.processStuff( inputObject )
    .subscribe()
}

Pour finir, reportez-vous à la documentation appropriée - Angular2 utilise RxJS v5 et le lien que vous avez fourni est destiné à RxJS v4. Les documents sont toujours incomplets pour la version 5, mais vous pouvez trouver des descriptions dans de nombreux fichiers source.

74
Sasxa