web-dev-qa-db-ja.com

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 Observable-ループ内のすべての関数呼び出しが終了するのを待ってから続行する方法?

しかし、配列と正しい構文を使用してforkJoinを正しく使用する方法を完全には習得していません。

私はあなたが提供できる助けに非常に感謝しています。

注:観測可能な値を返す3番目の関数の例

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

デフォルトではロードされない演算子をインポートする必要があります。それがEXCEPTION Observable.xxxx is not a functionが通常意味するものです。完全なrxjsをブートストラップに追加することにより、すべての演算子をインポートできます。たとえば、次のようにします。

import 'rxjs/Rx'

または、特定の演算子をインポートすることにより、あなたの場合:

import 'rxjs/add/observable/forkJoin'

コードに関する別の観察/提案:1つの構文に固執するようにしてください。あなたは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のドキュメントはまだ不完全ですが、多くのソースファイルで説明を見つけることができます。

74
Sasxa