Observable.forkJoin et argument de tableau

dans la documentation de Forkjoin Observables, il est dit que args peut être un tableau mais il ne donne pas d'exemple le faisant:

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

j'ai essayé une fonction similaire à ce que j'ai énuméré (ci-dessous) mais est venu 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 à une boucle pour finir avant de procéder comme demandé ici: Angular2 Observable - comment attendre que tous les appels de fonction dans une boucle pour finir avant de procéder?

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

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

NOTE: EXEMPLE DE TROISIÈME FONCTION QUI RENVOIE UNE 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()
}
31
demandé sur Sonicd300 2016-02-28 01:50:45

1 réponses

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, dactylographié... et tandis qu'il travaille, il ça ne fera que t'embrouiller à long terme. Aussi, si vous commencez avec des 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()
}

enfin, référez - vous à la documentation correcte-Angular2 utilise RxJS v5 et le lien que vous avez fourni est pour RxJS v4. Les Docs sont encore incomplets pour v5, mais vous pouvez trouver des descriptions dans de nombreux fichiers source.

59
répondu Sasxa 2017-03-01 20:11:18