2016-10-25 15 views
2

でチェーン観測私はAngular2と観測に新しいです。私は観測者の連鎖の結果を私のリゾルバに返そうとしているので、SOの答えを見つけることができませんでした。 1つの観測値だけを返すとすべてうまく動作しますが、それらが連鎖すると失敗します。私は2回連続同じテスト関数を呼び出すにコードを簡素化しました:2角度:レゾルバ

@Injectable() 
export class SwResolve implements Resolve<any> { 
    constructor(private swService: SwService) {}  
     resolve (route: ActivatedRouteSnapshot): Observable<MyObject> | Promise<any> | any { 
      this.swService.getTestData().subscribe(data => { 
       return this.swService.getTestData(); 
      }); 
     } 
} 

はSwComponent:

export class SwComponent implements OnInit {constructor(
    private route: ActivatedRoute, 
    private router: Router 
) { } 

    ngOnInit(): void { 
    this.route.data.forEach((data: any) => { 
     // Handle data received 
    }); 
    } 
}; 

SwService:私はここで何が問題を

getTestData() { 
    return Observable.create(observer => { 
     let testObject : SwDataObject = { 
     'labels':['value0','value1'], 
     'desktop':[123,456], 
     'mobile':[789,1011] 
     }; 
     observer.next(testObject); 
     observer.complete(); 
    }); 
    } 

をやっていますか?

ありがとうございます!

編集Jun 17: RxJsのメソッド(flatMap、mergeMap、...)の周りに私の頭を包み込むのにしばらく時間がかかりました。主な理由は、私はちょうどそれらの機能面を得ていなかったからです。私はチャールズ・スカルカニの同じボートにいる人々にthese excellent series of articles on functional programmingを見てもらうことを勧めます。

答えて

4

解決機能は、観察が返されることを期待しています。非同期の結果だけを返すので、あなたがやっていることは正しくありません。あなたは最初の観測可能物を呼び出していて、その観測物に購読しています。時間が経過し、最初の観測値が解決された場合にのみ、観測値を返します。

このようなもの(Promise.then(kind of)と同様の動作)は、flatMap/mergeMap(RxJS5のエイリアス)です。

これにあなたのコードをリファクタリング:

@Injectable() 
export class SwResolve implements Resolve<any> { 
    constructor(private swService: SwService) {}  
     resolve (route: ActivatedRouteSnapshot): Observable<MyObject> | Promise<any> | any { 
      return this.swService.getTestData().mergeMap(data => 
       return this.swService.getTestData(); 
      ); 
     } 
} 

これが何をするかは、すぐに観察を返すことです。あなたが別の観測可能を返すことを期待 - mergeMapは何

は、入力としてイベントを取得する(呼び出すあなたの最初のgetTestData(から、この場合の結果))です。フードの下では、この観察可能な部分に登録して結果を平坦化します。

これが不明である場合、私はあなたがいくつかを読むことをお勧めしてmergeMap記事のトンがあります。ここでは良いスタートだ:ありがとう@KwibtenP https://github.com/btroncone/learn-rxjs/blob/master/operators/transformation/mergemap.md

+0

、mergeMapとflatMapは、何らかの理由でHTTP呼び出しへの排他的だったことを考えていました。あなたが持っているATMのコードを投稿することができますプロパティを読み取ることができません「シンボル(Symbol.iterator」)undefined' – Stanislasdrg

+0

の: 'TypeError例外:コードは、別のエラーを返します。私は、マージマップの答えでリターンステートメントが欠落していることがわかります。私はそれを更新しました(上記の答えを参照)。それが助けてくれたらどうぞ。 – KwintenP

+0

ありがとうKwintenP、それは更新されたバージョンで動作します! – Stanislasdrg