2017-01-19 17 views
2

私はIon 2(Angular 2)プロジェクトでng2 translateを使用し始めました。私は一度にいくつかの文字列を取得する必要があるとき、コードは入れ子になり、読みにくくなることが分かりました。私はこのようなもの(なぜなら単なる値を出す)が観測可能なものを使う必要があるのか​​と疑問に思っていますが、おそらく理由があります。とにかく...ng2-Translate、rxjs observablesへの呼び出しを連鎖する方法は?

したがって、たとえば、方法

let result1: string; 
let result2: string; 
let result3: string; 
let result4: string; 

this.translate.get("key1").subscribe(value1 => { 
    result1 = value1; 
    this.translate.get("key2").subscribe(value2 => { 
     result2 = value2; 

     // do some other stuff, which may have another observable returned so yet another level of nesting) 

     this.translate.get("key3").subscribe(value3 => { 
      result3 = value3; 

      // do some other stuff 

      this.translate.get("key4").subscribe(value4 => { 
       result4 = value4; 
      } 
     } 
     ... 

に様々なポイントで読み取るために、私は4弦を持っていたと言う今4文字以上があると想像。また、この中に他のコードがある場合(例えば、Observableも返すIonicストレージを呼び出すこともあります)、コードは非常にネストされています。これはエラーハンドリングなしです。

ですから、問題は次のとおりです。これを行うには「フラット」な方法がありますか?たとえ何らかのトップレベルキャッチブロックがあったとしても、おそらくエラーハンドリングを含むチェーン化(プロミスのチェーン化に似ていても)です

私はチェーンの他の例を見ましたが、 。よりむしろ、上記のような観測の多くよりもオペレータ

答えて

3

であなたはそれらをチェーンする必要はありません。あなたは、観測を組み合わせることcombineLatestを使用することができます。

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/combineLatest'; 

Observable.combineLatest(
    this.translate.get("key1"), 
    this.translate.get("key2"), 
    this.translate.get("key3"), 
    this.translate.get("key4") 
) 
.subscribe(([result1, result2, result3, result4]) => { 
    console.log(result1); 
    console.log(result2); 
    console.log(result3); 
    console.log(result4); 
}); 
+0

上記作品素晴らしいが、私は、エラーをトラップする問題を抱えています。新しい[投稿](http://stackoverflow.com/questions/41755718/how-to-trap-errors-from-chained-rxjs-observables-when-using-combinelatest)でこれを開いてください。 – peterc

0

あなたのキー値のすべてを知っている場合文字列配列を取るtranslate.get()オーバーロードを使用することができます。

ので:

this.translate.get(['key1','key2','key3','key4']) 
    .subscribe(keys => { 
     console.log(keys.key1); 
     console.log(keys.key2); 
     console.log(keys.key3); 
     console.log(keys.key4); 
}); 
関連する問題