OK基本的に私が達成したいのは、共同クエリのように、別のオブザーバブルに依存するオブザーバブルです。さらに詳しく説明すると、2 つのテーブルがあります。1 つはアクティビティのテーブルで、もう 1 つはそれらのアクティビティの最終日のテーブルです。そのため、私がやろうとしているのは、まずアクティビティを取得してから、それらのアクティビティの最終日の検索を実行することです。両方のストリームを組み合わせて、アクティビティと最終日付を含む配列を 1 つの新しいオブジェクトに返すことができます。
私は運がなくてもさまざまな実装を試しました。
これが私の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();
これはコンパイルされますが、動作しません
そして最後のものは私がそれを機能させるのに最も近いものですが、それはオブザーバブルの実装が悪いことを知っています:
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();
このアプローチで私が経験したもう1つの問題は、ネストされたオブザーバブルが何も返さない場合は機能しないため、即興のソリューションを実行する必要がありましたが、ネストされたオブザーバブルが何も返さない場合、flatMapまたはmergeMapが機能しないかどうか疑問に思っています