好的,基本上我想要实现的是一个依赖于另一个可观察对象的可观察对象,例如联合查询。为了详细说明,我有两张表,一张是活动,另一张是这些活动的最终日期,所以我要做的是首先获取活动,然后搜索这些活动的最终日期,最好是能够结合这两个流以在单个新对象中返回一个包含活动和最终日期的数组。
我尝试了不同的实现,但没有任何运气。
这是我实现 service.ts 的方式(表的两个服务是相同的):
private actividadesSubject = new BehaviorSubject([]);
private actividades: ActividadPlaneacion[];
// <------------------------ GET ------------------------>
getActividades(): Observable<ActividadPlaneacion[]>{
return this.actividadesSubject.asObservable();
}
loadActividades(){
var sub = this.http.get(this.url+'select/actividadPlaneacion')
.map(this.extractData)
.catch(this.handleError);
sub.subscribe(
data => this.actividades = data,
err => console.log(err),
() => this.refresh()
);
}
private refresh() {
this.actividadesSubject.next(this.actividades);
}
以及我尝试实现这一点的各种方法(在 component.ts 上):MergeMap
this.actividadService.getActividades().mergeMap( actividad =>
this.actividadFechasFinalService.getActividadByIDYear(actividad.ID, actividad.Anio).subscribe( actividades => this.arregloActividadesFlatMap = actividades ));
(这不会编译)
平面图:
this.actividadService.getActividades().flatMap( actividad => {
this.actividadFechasFinalService.getActividadByIDYear(actividad[0].ID, actividad[0].Anio).subscribe( actividades => this.arregloActividadesFechasFinales = actividades );
return Observable.of(actividad)});
this.actividadService.loadActividades();
这确实编译但不起作用
最后一个是我最接近它的工作,但我知道这是一个糟糕的 observables 实现:
this.actividadService.getActividades().flatMap((actividades: any[]) => {
if(actividades.length > 0){
return Observable.forkJoin(
actividades.map((actividad: any) => {
return this.actividadFechasFinalService.getActividadByIDYear(actividad.ID, actividad.Anio)
.map((res: any) => {
let actividadPlaneacion;
console.log(res);
console.log('j = '+this.j);
this.j++;
if(res.length > 0){
res.map( (object) => {
console.log(this.i);
this.i++;
console.log(object);
console.log('object');
//console.log(res[0].FechaFinal);
//let object: any = res;
actividadPlaneacion = new ActividadPlaneacionMasFechasFinales(actividad.ID, actividad.Descripcion, actividad.Nombre, actividad.FechaInicio, actividad.Responsable,
actividad.Practica, actividad.Departamento, actividad.Evidencia, actividad.Producto, object.Actividad, object.FechaFinal, object.Completado, actividad.Anio);
let exists = this.arreglo.find(fecha => fecha.FechaFinal == actividadPlaneacion.FechaFinal);
console.log(exists);
if(exists == undefined)
this.arreglo.push(actividadPlaneacion);
this.arreglo = this.arreglo.sort(function(a, b){
if ( a.FechaFinal < b.FechaFinal )
return -1;
if ( a.FechaFinal > b.FechaFinal )
return 1;
return 0;
});
});
} else{
let existsActividad = this.arreglo.find(fecha => fecha.FechaFinal == actividad.FechaFinal);
console.log(existsActividad);
if(existsActividad == undefined){
actividadPlaneacion = new ActividadPlaneacionMasFechasFinales(actividad.ID, actividad.Descripcion, actividad.Nombre, actividad.FechaInicio, actividad.Responsable,
actividad.Practica, actividad.Departamento, actividad.Evidencia, actividad.Producto, null, null, null, actividad.Anio);
} else {
const index: number = this.arreglo.indexOf(existsActividad);
if (index !== -1) {
this.arreglo.splice(index, 1);
}
} //capitulo
let exists = this.arreglo.find(fecha => fecha.FechaFinal == actividadPlaneacion.FechaFinal);
console.log(exists);
if(exists == undefined)
this.arreglo.push(actividadPlaneacion);
}
return actividadPlaneacion;
});
})
);
}
console.log('FINALLL');
if(actividades.length == 0)
this.getActividades();
return actividades;
}).subscribe(
actividades => this.arregloActividadesFlatMap = actividades
);
this.actividadService.loadActividades();
我在使用这种方法时遇到的另一个问题是,如果嵌套的 observable 什么都不返回,它就不起作用,所以我不得不做一个即兴的解决方案,但我想知道如果嵌套的 observable 什么都不返回,flatMap 或 mergeMap 是否不起作用