将承诺与可观察合并



这是我服务的摘录,我希望getIssuesmetod 返回可观察的,而不是承诺解析为可观察的,因为它看起来要干净得多。我相信有办法,我只是对此有点太陌生了。

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

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

可观察量(默认情况下(是惰性的,只有在您订阅它们后才会开始运行。承诺是渴望的,并将立即开始运行。这可能会导致难以调试的条件,因为您的 observalified-promise 可能会运行并完成超出您的可观察量的范围。

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

这样的函数可以工作:

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

@Wandrille展示了如何从承诺中获得可观察量。

你也可以使用"from((",这也应该适用于Promises。 现在你可以使用所有的rxjs魔法了。

在您的情况下,您希望从一个流(承诺(切换到另一个流(htt.get(。因此,我将使用"switchMap",然后在该"映射"之后以您想要的格式获取日期。

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

热情的问候

最新更新