【发布时间】:2019-07-11 07:48:42
【问题描述】:
我正在我的角度服务层上创建一种商店。
private attributes: Observable<Attribute[]>;
private attributes$: BehaviorSubject<Attribute[]>;
当用户要求allAttributes() 时填写。然后对所有属性或单个属性 (getAttribute(id)) 的后续请求从同一存储返回数据。
这是我的getAttribute()
getAttribute(id: number): Promise<Observable<Attribute>> {
return new Promise((resolve) => {
let _attributeObservable;
const _attributes: Attribute[] = this.getAttributesState();
let _attributeFound = false;
for (const _attribute of _attributes) {
if (_attribute.id === id) {
_attributeFound = true;
break;
}
}
if (_attributeFound) {
_attributeObservable = this.attributes.pipe(map((_attributeList: Attribute[]) => {
return _attributeList.find(_attribute => _attribute.id === id);
}));
resolve(_attributeObservable);
} else {
return this.http.get(`${this.context}/attributeService/getAttribute/${id}`)
.subscribe((_attributeInfo: Attribute) => {
const _allAttributes = this.getAttributesState();
_allAttributes.push(_attributeInfo);
// push object to store that was not found
this.attributes$.next(Object.assign([], _allAttributes));
_attributeObservable = this.attributes.pipe(map((_attributeList: Attribute[]) => {
return _attributeList.find(_attribute => _attribute.id === id);
}));
resolve(_attributeObservable);
});
}
});
}
和
getAttributesState(): Attribute[] {
return this.attributes$.getValue();
}
现在有些情况下其他用户可以添加属性,这样该属性就不会出现在商店中。因此,如果未找到请求的 属性,则会发出 http 请求并将其保存到存储中。
但问题是如果找到属性然后它工作,但其他部分不工作。可能是什么问题?这段代码是否可以简化,更好的方法?
【问题讨论】:
-
为什么要在
Promise中返回Observable?看起来很复杂。我认为您应该看看RxJS的地图运算符(switchMap、concatMap、mergeMap等),您可以将它们链接起来。你可以查看这个marble diagrams。 -
是的,我可以返回
Observable<Observable<Attribute>>,因为我需要连接属性来监听变化。 -
只返回一个 Observable 的属性。你不应该在 Observable 中有一个 Observable。
-
@DenniJensen,我需要连接属性,以便可以监听属性中的更新等进一步更改。这就是为什么它会这样。能否请您给出解决问题的答案?
-
一个热门的 observable 可以让你听到变化...
标签: angular promise rxjs observable