Как вернуть сервисную функцию как наблюдаемую в Angular 7? - PullRequest
0 голосов
/ 05 января 2019

У меня есть этот 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

Как я могу вернуться из метода delete () BasicOperationService в качестве наблюдаемого?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы можете обслуживать данные как наблюдаемые, используя 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 вы должны вернуть наблюдаемое -

0 голосов
/ 05 января 2019

Может быть, я неправильно понимаю, но вы, возможно, вам следует

return service.delete(id);

и не подписывайтесь.

Тогда подписывайтесь только на тот компонент, который потребляет услугу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...