Как связать вызовы ng2-Translate и наблюдаемых в rxjs вообще?

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

Так, например, скажем, у меня было 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 верхнего уровня)

Я видел другой пример создания цепочек, но они, похоже, делают больше с операторами, а не с множеством наблюдаемых, как выше.

2 ответа

Решение

Вам не нужно их связывать; ты можешь использовать 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);
});

Если вы знаете все свои ключевые значения заранее, вы можете использовать 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);
});
Другие вопросы по тегам