将可观察量组合成一组可观察量

时间:2018-03-22 00:39:10

标签: javascript angular typescript rxjs observable

我在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

的可观察数组?

2 个答案:

答案 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 
        });
      }))