这里是我的服务的摘要,我希望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)),
);
});
}
}
答案 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) )
)
}
热烈的问候