Как перехватывать ошибки из цепочек наблюдаемых rxjs при использовании combLatest?

Вслед за этот пост, у меня есть следующее

Observable.combineLatest(
        this.translate.get("key1"),
        this.translate.get(""),
        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);
    },
      error => {
        console.log(`${error}`);            
   });  

В строке 2 я получаю сообщение об ошибке, но, похоже, это не входит в обработчик error выше. К сожалению, примеры и документы, которые я нахожу, не содержат сведений о том, как отлавливать ошибки (предположим, что приведенное выше сработает).

У кого-нибудь есть идеи о том, как это сделать?


person peterc    schedule 20.01.2017    source источник


Ответы (1)


Мне кажется вероятным, что this.translate.get("") проверяет аргумент и выбрасывает «за пределы» наблюдаемого (т.е. еще до того, как он создаст свой наблюдаемый).

Вы можете проверить обработку ошибок, используя такой код:

import "rxjs/add/observable/throw";

Observable.combineLatest(
  this.translate.get("key1"),
  Observable.throw(new Error("Boom!")),
  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);
  },
  error => {
    console.log(`${error}`);
  }
);

И вы можете убедиться, что this.translate.get("") выдает ошибку «вне» наблюдаемого, например:

import "rxjs/add/observable/defer";

Observable.combineLatest(
  this.translate.get("key1"),
  Observable.defer(() => this.translate.get("")),
  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);
  },
  error => {
    console.log(`${error}`);
  }
);

Если это то, что он делает, я думаю, это разумное поведение, поскольку маловероятно, что пустой ключ действителен. Об ошибках, которые являются более «внутренними», скорее всего, будет сообщено через наблюдаемое, и они должны обрабатываться обратным вызовом ошибки, который вы передали в subscribe.

person cartant    schedule 20.01.2017
comment
Хорошо, я вижу. Я попытался добавить обычный (не связанный с rxjs) блок try/catch вокруг всей партии, и ошибка все же попала в catch. Так что я полагаю, что это все, что мы можем здесь сделать. - person peterc; 20.01.2017
comment
Вы можете взглянуть на источник, чтобы убедиться, что это то, что происходит, но если ошибка не выдается через наблюдаемое, это так, и вы ничего не можете с этим поделать, кроме как убедиться, что вы передаете действительные ключи. - person cartant; 20.01.2017
comment
Это хорошая идея (посмотрите на источник). Да, действительно в самом верху выдает ошибку, если ключ не определен или имеет нулевую длину. Также я нашел другой метод instant() (я не знал об этом), который просто возвращает строку - в документе это просто) объясняет необходимость убедиться, что асинхронная загрузка файла завершена, если вы используете этот. - person peterc; 21.01.2017