webentwicklung-frage-antwort-db.com.de

Observable.forkJoin- und Array-Argument

In der Dokumentation zu Observables forkJoin heißt es, dass args ein Array sein kann, aber es wird kein Beispiel dafür aufgeführt:

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

Ich habe eine ähnliche Funktion wie die unten aufgeführte ausprobiert, habe jedoch einen Fehler festgestellt:

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

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

Eine gescherte Version meiner Funktion unten:

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();
    });

  });
}

Die Wurzel meiner Frage hängt mit einer Schleife zusammen, die beendet werden muss, bevor ich fortfahre, wie hier gefragt: Angular2 Observable - Wie warte ich, bis alle Funktionsaufrufe in einer Schleife beendet sind, bevor ich fortfahre?

Aber ich habe die korrekte Verwendung von forkJoin mit einem Array und der richtigen Syntax dazu nicht vollständig beherrscht.

Ich bin sehr dankbar für Ihre Hilfe.

HINWEIS: BEISPIEL FÜR EINE DRITTE FUNKTION, DIE EIN BEOBACHTBARES ERGEBNIS ERHÄLT

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

Sie müssen Operatoren importieren, die nicht standardmäßig geladen sind. Das bedeutet normalerweise EXCEPTION Observable.xxxx is not a function. Sie können entweder alle Operatoren importieren, indem Sie Ihrem Bootstrap das vollständige rxjs hinzufügen, zum Beispiel:

import 'rxjs/Rx'

oder durch Importieren bestimmter Operatoren in Ihrem Fall:

import 'rxjs/add/observable/forkJoin'

Noch eine Bemerkung/ein Vorschlag zu Ihrem Code: Versuchen Sie, sich an eine Syntax zu halten. Sie mischen es5, es6, TypeScript ... und während es funktioniert, wird es Sie auf lange Sicht nur verwirren. Wenn Sie gerade mit Observables beginnen, vermeiden Sie new Observable() und verwenden Sie stattdessen Erstellungsoperatoren.

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()
}

Lesen Sie abschließend die korrekte Dokumentation - Angular2 verwendet RxJS v5 und der von Ihnen angegebene Link gilt für RxJS v4. Die Dokumente für Version 5 sind noch unvollständig, Beschreibungen finden Sie jedoch in vielen Quelldateien.

74
Sasxa