Подтвердить что ты не робот

Observable.forkJoin и аргумент массива

В документации Observables forkJoin говорится, что args может быть массивом, но в нем нет примера:

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

Я пробовал функцию, подобную той, что я перечислял (ниже), но придумал ошибку:

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

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

Измененная версия моей функции ниже:

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

  });
}

Корень моего вопроса связан с циклом до конца, прежде чем приступать к рассмотрению здесь: Angular2 Наблюдаемый - как дождаться завершения всех вызовов функций в цикле до продолжения?

Но я не полностью освоил правильное использование forkJoin с массивом и правильным синтаксисом для этого.

Я очень благодарен за помощь, которую вы могли бы предложить.

ПРИМЕЧАНИЕ: ПРИМЕР ТРЕТЬЕЙ ФУНКЦИИ, ВОЗВРАЩЕННЫЙ НАБЛЮДЕНИЕМ

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

Ответ 1

Вам нужно импортировать операторы, которые по умолчанию не загружены. То, что обычно означает EXCEPTION Observable.xxxx is not a function. Вы можете импортировать все операторы, добавив полный rxjs к вашему бутстрапу, например:

import 'rxjs/Rx'

или импортируя определенные операторы, в вашем случае:

import 'rxjs/add/observable/forkJoin'

Еще одно замечание/предложение о вашем коде: попытайтесь придерживаться одного синтаксиса. Вы смешиваете es5, es6, typescript... и пока он работает, это только смущает вас в долгосрочной перспективе. Кроме того, если вы только начинаете с Observables, старайтесь избегать new Observable() и вместо этого используйте операторы создания;

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

Наконец, обратитесь к правильной документации - Angular2 использует RxJS v5, а ссылка, предоставленная для RxJS v4. Документы по-прежнему неполны для v5, но вы можете найти описания во многих исходных файлах.