将诺言与可观察性

时间:2018-07-05 20:47:03

标签: angular rxjs rxjs6

这里是我的服务的摘要,我希望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 个答案:

答案 0 :(得分:3)

最简单的方法是用Observable.from()包装一个Promise以使其遵守Observable接口。但这不会改变其热度/冷度,并可能导致意外的行为。

可观察项(默认情况下 )是惰性的,只有订阅它们后才能开始运行。承诺很热切,将立即开始运行。这可能导致难以调试的情况,因为您的观测承诺可能会运行并完全超出您的观测范围。

要解决此问题,您可以使用Observable.defer(() => myPromise()),这样,只有在Observable.defer订阅后,您的诺言才会被调用(并开始运行)。

答案 1 :(得分:0)

这样的功能将起作用:

getIssues() {
  return mergeMap(val =>
    fromPromise(myPromise(val))
  )
}

答案 2 :(得分:0)

@Wandrille展示了如何从诺言中获得可观察的东西。

您还可以使用“ from()”,它也应与Promises一起使用。 现在,您可以在其上使用所有rxjs魔术了。

在您的情况下,您想从一个流(promise)切换到另一种流(htt.get)。因此,我将使用“ switchMap”,然后使用“ map”以所需的格式获取日期。

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) )
    )
}

热烈的问候