2017-01-19 2 views
2

Я только что начал использовать ng2 translate в своем проекте Ionic 2 (Angular 2). Я обнаружил, что когда мне нужно получить сразу несколько строк, код становится вложенным и намного сложнее читать. Я как бы удивляюсь, почему что-то подобное (просто испускающее одно значение) нужно использовать наблюдаемое, но, возможно, есть веская причина. Так или иначе ...Как подключить вызовы к ng2-Перевести, а rxjs наблюдаемые вообще?

Так, например, сказать, что я имел 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), код становится очень вложенным - и это без обработки ошибок.

Итак, вопрос в том, есть ли «более плоский» способ сделать это? Есть ли какая-либо цепочка (даже если она похожа на обещание) на цепочку), возможно, включая обработку ошибок (даже если был какой-то блок 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); 
}); 
Смежные вопросы