2017-01-19 57 views
2

我剛開始在我的Ionic 2(Angular 2)項目中使用ng2 translate。我發現,當我需要一次獲得幾個字符串時,代碼變得嵌套並且難以閱讀。我有點想知道爲什麼像這樣(這只是發出一個單一的值)需要使用可觀察,但也許有一個很好的理由。反正...如何將調用鏈接到ng2-Translate,以及一般的rxjs observables?

因此,例如,說我有4個字符串在不同的點在方法

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串讀。另外,當中間存在其他代碼時(例如,我也可以調用Ionic存儲,它也返回一個Observable),代碼變得非常嵌套 - 這是沒有錯誤處理的。

所以,問題是:是否有「更平坦」的方式來做到這一點?是否有任何鏈接(即使類似於Promise「鏈接」),也許包括錯誤處理(即使有某種頂級catch塊)

我已經看到了鏈接的其他例子,但他們似乎做更多與運營商,而不是像上面觀測的很多

回答

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

以上的偉大工程,但我有捕捉錯誤的問題。已經在新的[post]中打開了這個(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); 
}); 
相關問題