Наблюдаемые: flatMap случайно не запускается

Я сталкиваюсь со случайным поведением оператора flatMap и не могу найти причину. Иногда срабатывает, иногда нет...

Вот ситуация: пользователь может изменить язык в моем приложении, поэтому у меня есть BehaviorSubject на языке (который запускается списком выбора), возвращаемый поставщиком в качестве наблюдаемого. Когда есть изменения, я вызываю (через flatMap) http-запрос для получения данных на выбранном языке.

Это выглядит так:

this.languageProvider.getLang$().flatMap(langCode => {
  return this.http.get(`https://SERVER_URL.net/datas?lang=${langCode}`)
  .map(data => data.json())
})
.subscribe(
  data => {
    // do smth
  },
  err => {
    // do smth
  }
);

Дело в том, что когда я меняю язык, чаще всего не срабатывает http-вызов.

Если я добавлю простую подписку, она всегда будет работать...

this.languageProvider.getLang$().subscribe(langCode => {
  console.log(langCode);
});

Любая идея, почему у меня есть эта проблема?

Вот языковой провайдер:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class LanguageProvider {
  private lang$: BehaviorSubject<string>;

  constructor() {
    this.lang$ = new BehaviorSubject('en');
  }

  setLang(langCode: string) {
    this.lang$.next(langCode);
  }

  getLang$(): Observable<string> {
    return this.lang$.asObservable();
  }
}

Большое спасибо


person Maslow    schedule 12.09.2017    source источник


Ответы (1)


Хорошо, исправил.

На самом деле это было не случайно...

В моем (упрощенном) фрагменте я не написал, как обработал ответ сервера. На самом деле я мог бы получить КОД СОСТОЯНИЯ 304, если бы попытался получить данные, которые не изменились на сервере (я делаю это, чтобы не загружать данные сервера каждый раз, когда пользователь запускает приложение)

Дело в том, что мне пришлось обрабатывать 304 в обратном вызове ошибки, поскольку angular воспринимает все, что выше 299, как ошибку.

ЧЕГО Я НЕ ЗНАЛ, так это того, что обратный вызов ошибки убивал мою наблюдаемую. Таким образом, псевдослучайное поведение на самом деле было следующим: - Если я попытался перезагрузить приложение, не меняя язык, то я получил 304, поэтому наблюдаемый объект был убит - Если я попытался перезагрузить приложение после смены языка, тогда приложение получить данные для этого языка и получить 200. Таким образом, obserbavle будет продолжать работать

Может быть, это поможет кому-то. Ваше здоровье

person Maslow    schedule 12.09.2017