Как вернуть сервисную функцию как наблюдаемую в Angular 7?
У меня есть этот код service.ts:
export class BasicOperationService {
constructor() { }
delete(service: any, object: any, data: any): Observable<any> {
const id = this.getId(object);
let index: number;
for (let i = 0; i < data.length; i++) {
if ( data[i].id === id) {
index = i;
break;
}
}
return service.delete(id).subscribe(result => {
data.splice(index, 1);
return data;
}, error => {
console.log(error);
return data;
});
}
}
И у меня есть этот component.ts:
delete(object: any, id: number) {
this.loadingId = id;
this.basicOperation.delete(this.photoalbumService, object, this.content.data)
.subscribe(result => {
this.content.data = result;
this.loadingId = 0;
});
}
И теперь я получаю это сообщение об ошибке:
TypeError: this.basicOperation.delete(...).subscribe is not a function
Как я могу вернуться из метода dele te () BasicOperationService в качестве наблюдаемого?
2 ответа
Вы можете обслуживать данные как наблюдаемые, используя Rxjs "of", например
return of({id:1,data:"hello word})
Но, в вашем случае, вы должны использовать switchMap, потому что вы должны ждать окончания service.delete.
delete(service: any, object: any, data: any): Observable<any> {
const id = this.getId(object);
let index: number;
for (let i = 0; i < data.length; i++) {
if ( data[i].id === id) {
index = i;
break;
}
}
return service.delete(id).pipe(
//we don't return the result of delete, else "data.splice"
switchMap(result =>{
data.splice(index,1);
return of(data);
}))
}
Тогда вы подписываетесь в компоненте
Обновление, как говорит IngoBürk в своих комментариях, в этом случае НЕ использует switchMap, просто вы можете использовать карту.
delete(service: any, object: any, data: any): Observable<any> {
...
return service.delete(id).pipe(
map((result)=>{
data.splice(index,1);
return data;
}))
}
"map" преобразует результат, а "return" должен быть объектом. "switchMap" используется, если вы хотите вернуть другое наблюдаемое - это потому, что в swithmap вы должны вернуть наблюдаемое
Может быть, я неправильно понимаю, но вы, возможно, вы должны
return service.delete(id);
и не подписывайтесь.
Затем подпишитесь только на тот компонент, который потребляет услугу.