угловая труба rxjs удалить элемент из массива - PullRequest
0 голосов
/ 30 октября 2018

У меня есть сервис с функцией удаления. Функция удаления вызовет API и вернет true или false. Когда это правда, я буду искать индекс в моем массиве, склеивать его и возвращать новый массив. Так например

private items = [];
onItemDeleted  = new Subject<any>();

  delete(id:number): Observable<any> {
    return this.http.delete('http://my.api.com/item/' + id)
      .pipe(
        switchMap(checkServerSuccessResponse),
        map(data => {
            const index1  = this.items.findIndex((element) => {
              return element.id === id;
            });
            if (index1 >= 0 ) {
              this.items.splice(index1,1);
            }
            this.onItemDeleted.next(this.items);
            return this.items;
          }
        ),
        catchError(returnFalse),
      );
  }

У меня есть помощник для карты переключателей:

export function checkServerSuccessResponse(data: Response): Observable<any> {
    return (data && data['success'] === true) ? of(data) : throwError("server responded false");
}

Хотя это работает, я чувствую, что раздел карты можно переформатировать. Сначала я подумал о фильтре (после карты переключателей), чтобы исключить элемент с указанным идентификатором, а затем создал новый массив, но потом понял, что фильтр не подписан на массив this.items.

Как лучше всего это сделать?

1 Ответ

0 голосов
/ 30 октября 2018

Я не знаю вас другого кода, например, откуда взялся this.items, почему вы публикуете обновленные элементы в onItemDeleted. Но я бы, вероятно: a) передал this.items для удаления метода, такого как delete(id, items), потому что в то время, когда придет ответ, вы не знаете, что произойдет с this.items; б) то, что внутри карты, перейдите к отдельной функции, которая будет removeById(items, id); в) упростить pipe. Как это:

private items = [];
onItemDeleted  = new Subject<any>();

  removeById(fromItems, id) {
    const index1  = fromItems.findIndex((element) => {
      return element.id === id;
    });
    if (index1 >= 0 ) {
      fromItems.splice(index1,1);
    }
    return fromItems;
  }

  // who ever calls this, should provide copy of items also
  // then you will be kinda protected from concurrent
  // modification, when http response complete, but this.items
  // is completely different, from when http request started
  delete(fromItems, id:number): Observable<any> {
    return this.http.delete('http://my.api.com/item/' + id)
      .pipe(
        switchMap(checkServerSuccessResponse),
        map(data => this.removeById(fromItems, id)),
        tap(items => this.onItemDeleted.next(items)),
        catchError(returnFalse),
      );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...