Observables:flatMap 随机未触发
Observables: flatMap randomly not triggered
我遇到了 flatMap 运算符的随机行为,我找不到原因。有时会触发,有时不会...
情况如下:
用户可以更改我的应用程序中的语言,因此我在该语言上有一个 BehaviorSubject(由 select 列表触发)作为其提供者的可观察对象返回。当发生变化时,我调用(通过 flatMap)一个 http 请求来获取 selected.
语言的数据
看起来像这样:
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();
}
}
非常感谢
好的,已修复。
实际上并不是随机的...
在我的(简化的)片段中,我没有写下我是如何处理服务器响应的。实际上,如果我尝试获取服务器上未更改的数据,我可能会收到 304 STATUS CODE(我这样做是为了避免每次用户启动应用程序时都下载服务器数据)
问题是,我必须在错误回调中处理 304,因为 angular 将 299 以上的所有内容都视为错误。
我不知道的是错误回调正在杀死我的可观察对象。所以伪 "random" 行为实际上是:
- 如果我尝试在不更改语言的情况下重新加载应用程序,则会收到 304,因此 observable 被杀死
- 如果我在更改语言后尝试重新加载应用程序,那么该应用程序将获取该语言的数据并获得 200。因此 obserbavle 将继续工作
也许这会对某人有所帮助。
干杯
我遇到了 flatMap 运算符的随机行为,我找不到原因。有时会触发,有时不会...
情况如下: 用户可以更改我的应用程序中的语言,因此我在该语言上有一个 BehaviorSubject(由 select 列表触发)作为其提供者的可观察对象返回。当发生变化时,我调用(通过 flatMap)一个 http 请求来获取 selected.
语言的数据看起来像这样:
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();
}
}
非常感谢
好的,已修复。
实际上并不是随机的...
在我的(简化的)片段中,我没有写下我是如何处理服务器响应的。实际上,如果我尝试获取服务器上未更改的数据,我可能会收到 304 STATUS CODE(我这样做是为了避免每次用户启动应用程序时都下载服务器数据)
问题是,我必须在错误回调中处理 304,因为 angular 将 299 以上的所有内容都视为错误。
我不知道的是错误回调正在杀死我的可观察对象。所以伪 "random" 行为实际上是: - 如果我尝试在不更改语言的情况下重新加载应用程序,则会收到 304,因此 observable 被杀死 - 如果我在更改语言后尝试重新加载应用程序,那么该应用程序将获取该语言的数据并获得 200。因此 obserbavle 将继续工作
也许这会对某人有所帮助。 干杯