我在Angular中有这段代码
this.provider.getUids()
.then(uidObservable => this.uidsSubscription$ = uidObservable.subscribe((uids: string[]) => {
console.log('res', uids); // array of uids
const uidsSet = new Set(uids); // deletes duplicates
uidsSet.forEach(uid => {
this.userObservables.push(this.otherProvider.getSharedUserData(uid)); // this is the code I need to change
});
}))
当我触发observale发出新值时。 this.userObservables.push 会有重复的值。
假设我只有一个uid: AAAAA 那么 this.userObservables 只包含 AAAAA 的可观察性 现在,当我触发observable发出一个新值 BBBBB 时 this.userObservables 将包含 AAAAA AAAAA BBBBB
的观察值有没有办法防止这种行为我想要一个像 AAAAA BBBBB
的可观察数组?答案 0 :(得分:2)
你可以这样做:
this.uidsSubscription$ = Observable.fromPromise(this.provider.getUids())
.flatMap(obs$ => obs$)
.map(uids => new Set(uids))
.map(uids => uids.map(uid => this.otherProvider.getSharedUserData(uid)))
.subscribe(observables => this.userObservables = observables);
但是,provider.getUids
返回Promise<Observable<>>
听起来很奇怪,应该重新设计。
另请注意,使用$
添加后缀是不常见的。典型的惯例是以这种方式后缀observable,而不是订阅。
而且,最后,也让我感到奇怪的是,这个observable只为一些数组分配了一个observable数组。您通常希望在此处继续链接,以便以您需要的任何方式订阅它们。总的来说,这段代码的设计看起来很奇怪,但没有更多的信息,这只是一个XY问题。
答案 1 :(得分:0)
我找到了一个解决方案,虽然不是我认为最好的解决方案。我在subscribe方法的开头重置了observable的数组。 (愿上帝原谅我这个丑陋的代码!)
this.provider.getUids()
.then(uidObservable => this.uidsSubscription$ = uidObservable.subscribe((uids: string[]) => {
console.log('res', uids); // array of uids
const uidsSet = new Set(uids); // deletes duplicates
this.userObservables = [];
uidsSet.forEach(uid => {
this.userObservables.push(this._ShareListProvider.getSharedUserData(uid)); // this is the code I need to change
});
}))