我有这个代码片段,可以进行一些数据处理并返回一个数组。
choose(n?: number): Observable<PickQuality[]> {
this.championService.getChampions()
.subscribe(champions => {
if(this.options.length == 0)
champions.forEach(champion =>
this.options.push(new PickQuality(champion, 0)));
// Some computing happens, chosen variable is defined here
this.chosenObserver.next(chosen);
});
let obs = new Observable<PickQuality[]>((observer => this.chosenObserver = observer));
return obs;
}
事情是每次select()运行时我必须从我的服务中调用getChampions(),因为我需要异步上下文来调用我的观察者的next()。 if子句解决了内容的复制问题,但我仍然过多地调用了我的服务。我怎样才能使服务只调用一次然后从对象本身检索数据?
PS:我必须像这样构建它,因为它依赖于来自服务的异步内容。填写我的&#34; this.options&#34;构造函数或ngOnInit()上的属性不起作用,因为select()调用会先发生,所以我必须在choose函数()中填充数组。
答案 0 :(得分:0)
如果我按如下方式构造代码,那么当选择被称为my&#34; this.options&#34;还没有被OnInit填充。
ngOnInit() {
this.championService.getChampions()
.subscribe(champions => {
champions.forEach(champion =>
this.options.push(new PickQuality(champion, 0)));
});
}
choose(n?: number): Observable<PickQuality[]> {
this.reevaluate();
var sorted = this.options.sort((a, b) => b.score - a.score);
var chosen: PickQuality[];
if(n) chosen = sorted.slice(0, n);
else chosen = sorted.slice(0, 1);
//this.chosenObserver.next(chosen);
let obs = new Observable<PickQuality[]>(observer => observer.next(chosen));
return obs;
}
我如何确保&#34;选择&#34;只在我的NgOnInit运行后运行?