我需要等待2个AJAX请求的结果才能对其进行计算。
我找到了似乎可以完成工作的Observable.forkJoin
方法。所以在我的组件中我添加了:
import { Observable } from 'rxjs/Rx';
// ...
ngOnInit() {
Observable.forkJoin(
this.instrumentService.current,
this.tuningService.tunings
).subscribe(
data => {
console.log(data);
}
);
}
发送了AJAX请求,但我从未传递subscribe
回调。
如果我尝试分别执行每个请求,它可以正常工作:
this.instrumentService.current.subscribe(instrument => {
console.log(instrument);
this.instrument = instrument;
});
this.tuningService.tunings.subscribe(tunings => {
console.log(tunings);
this.tunings = tunings;
});
在数据服务(instrumentService
和tuningService
)中,Observable
被声明为这样(可能是错误的来源,不知道):
private _tunings: BehaviorSubject<Tuning[]> = new BehaviorSubject([]);
/**
* Class constructor.
*
* @param {ApiService} apiService
*/
constructor (private apiService: ApiService) {
this.getAll().subscribe(tunings => this._tunings.next(tunings));
}
public get tunings() {
return this._tunings.asObservable();
}
public getAll(): Observable<Tuning[]> {
return this.apiService.call(this.url);
}
apiService
负责调用内置的角度http
服务。
答案 0 :(得分:3)
据我记得forkJoin
目前有一个错误,如果其中一个Observable
返回null
,则永远不会调用forkJoin
订阅。您可以尝试使用.zip
吗?
答案 1 :(得分:2)
对我来说,combineLatest
rxjs运算符原来是我正在寻找的运算符。它与BehaviorSubjects一起使用,您可能期望forkJoin
起作用:
任何可观察对象发出一个值时,请从每个观察对象中发出最后一个发出的值。
(文档:https://www.learnrxjs.io/learn-rxjs/operators/combination/combinelatest)