【问题标题】:Observables: flatMap randomly not triggeredObservables:flatMap 随机未触发
【发布时间】:2018-02-21 11:49:33
【问题描述】:

我遇到了 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();
  }
}

非常感谢

【问题讨论】:

    标签: javascript angular rxjs observable flatmap


    【解决方案1】:

    好的,修好了。

    其实并不是随机的……

    在我的(简化的)sn-p 中,我没有写下我是如何处理服务器响应的。实际上,如果我尝试获取服务器上未更改的数据,我可能会收到 304 STATUS CODE(我这样做是为了避免每次用户启动应用程序时都下载服务器数据)

    问题是,我必须在错误回调中处理 304,因为 Angular 将 299 以上的所有内容都视为错误。

    我不知道的是错误回调正在杀死我的 observable。所以伪“随机”行为实际上是: - 如果我尝试在不更改语言的情况下重新加载应用程序,那么我得到了 304,所以 observable 被杀死了 - 如果我在更改语言后尝试重新加载应用程序,那么应用程序将获取该语言的数据并获得 200。因此 obserbavle 将继续工作

    也许这会对某人有所帮助。 干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2018-08-23
      • 1970-01-01
      • 2018-08-15
      • 2014-07-17
      • 1970-01-01
      相关资源
      最近更新 更多