【发布时间】:2016-11-13 16:16:01
【问题描述】:
我有一个经常出现的模式,但我不知道解决它的最佳方法是什么。
我订阅了一个 observable(这里是路由器),它为我提供了值。我需要其中一个值来构建另一个请求以获取另一个 observable。但是我在订阅中有一个 observable。
我知道这不是一个好的模式,但我不知道该怎么做。
如果我使用第二个 observable 来获取另一个值并在 observable 的 observable 中获取另一个 observable。
如何解决这个问题,避免喝汤?
这是我的代码:
deal.component.ts
import {Component, OnInit, ChangeDetectionStrategy} from '@angular/core';
import {Observable} from "rxjs/Observable";
import {ActivatedRoute} from "@angular/router";
import {DealsService} from "../deals.service";
@Component({
templateUrl: './+deal.component.html',
styleUrls: ['./+deal.component.scss']
})
export class DealRouterComponent implements OnInit {
deal$: Observable<any>;
public dealId:string;
private sub:any;
constructor(
private route: ActivatedRoute,
private dealsService: DealsService) {}
ngOnInit() {
this.sub = this.route.params
.subscribe(params => {
this.dealId = params['id'];
this.deal$ = this.dealsService.getDeal(this.dealId);
})
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
deal.service.ts
import {Injectable, Inject} from "@angular/core";
import {Observable} from "rxjs/Observable";
import {AngularFireDatabase} from "angularfire2";
@Injectable()
export class DealsService {
constructor(private db: AngularFireDatabase) {}
getDeal(id) {
return this.db.object('deals/' + id);
}
}
deal.component.html
{{deal | async | json}}
【问题讨论】:
-
这种模式类似于嵌套的“承诺地狱”。解决方案是使用 mergeMap (flatMap) 操作符链接 observables。
标签: angular rxjs reactive-programming observable