代码之家  ›  专栏  ›  技术社区  ›  Akxe

可观察的合并承诺

  •  0
  • Akxe  · 技术社区  · 7 年前

    getIssues 我要返回可观察的,而不是承诺分解成可观察的,因为它看起来要干净得多。我相信有办法,我只是有点太新了。

    import { Injectable } from '@angular/core'; (...)
    
    @Injectable({ providedIn: 'root', })
    export class IssueService {
        private users!: Promise<Map<number, Users>;
        constructor(private http: HttpClient, private userService: UserService) {
            this.users = this.userService.getUsers()
        }
    
        getIssues() {
            return this.users.then(users => {
                return this.http.get<Iissue[]>(URL, OPTIONS).pipe(
                    map(issues => new Issue(issue, users)),
                );
            });
        }
    }
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   Mark van Straten    7 年前

    最简单的方法是用 Observable.from()

    可观测的是( 默认情况下 )懒惰,只会开始运行,一旦你订阅他们。承诺迫在眉睫,将立即开始执行。这可能会导致难以调试的情况,因为您遵守的承诺可能会运行&完全超出你的可观察范围。

    要解决这个问题,您可以使用 Observable.defer(() => myPromise()) 所以你的承诺只会被援引;订阅Observable.defer后开始运行)。

        2
  •  0
  •   Wandrille    7 年前

    getIssues() {
      return mergeMap(val =>
        fromPromise(myPromise(val))
      )
    }
    
        3
  •  0
  •   JanRecker    7 年前

    @旺德里尔展示了如何从承诺中得到一个可观察的结果。

    您还可以使用“from()”,这也应该适用于承诺。 现在你可以使用所有的rxjs魔法了。

    在您的例子中,您希望从一个流(promise)切换到另一个流(htt.get)。因此,我会使用“开关地图”和之后的“地图”,以获得您希望的格式的日期。

    getIssues():Observable<Issue>{
        return from(this.users).pipe(
            switchMap((users:Map<number, Users>) => this.http.get(URL,OPTIONS) ),
            map( (issues: IIssue[]): Issue => new Issue(issue,users) )
        )
    }
    

    推荐文章