Как я могу обработать результаты из http.get () в Angular 6 / RxJS 6? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь обновить приложение с Angular 5 до Angular 6 и не могу понять, как использовать новый синтаксис RxJS. Вот код, который я пытаюсь перенести:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';

@Injectable()
export class SearchService {
  constructor(private http: HttpClient) {}

  getAll() {
    return this.http.get('assets/data/people.json');
  }

  search(q: string): Observable<any> {
    if (!q || q === '*') {
      q = '';
    } else {
      q = q.toLowerCase();
    }
    return this.getAll().map((data: any) => {
      const results: any = [];
      data.map(item => {
        // check for item in localStorage
        if (localStorage['person' + item.id]) {
          item = JSON.parse(localStorage['person' + item.id]);
        }
        if (JSON.stringify(item).toLowerCase().includes(q)) {
          results.push(item);
        }
      });
      return results;
    });
  }

  get(id: number) {
    return this.getAll().map((all: any) => {
      if (localStorage['person' + id]) {
        return JSON.parse(localStorage['person' + id]);
      }
      return all.find(e => e.id === id);
    });
  }

  save(person: Person) {
    localStorage['person' + person.id] = JSON.stringify(person);
  }
}

Я знаю, что импорт должен измениться на:

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

И теперь вы должны использовать pipe() вместо map(), но у меня проблемы с выяснением как. Было бы замечательно, если бы это было так просто, как показано ниже, но, похоже, это не так.

    return this.getAll().pipe(
      map(data: any) => {
        const results: any = [];
        data.map(item => {
          // check for item in localStorage
          if (localStorage['person' + item.id]) {
            item = JSON.parse(localStorage['person' + item.id]);
          }
          if (JSON.stringify(item).toLowerCase().includes(q)) {
            results.push(item);
          }
        });
        return results;
    }));

1 Ответ

0 голосов
/ 04 мая 2018

Вам не хватает скобок в map(data:any) => {}. Это должно работать:

return this.getAll().pipe(
    map((data: any) => {
        const results: any = [];
        data.map(item => {
            // check for item in localStorage
            if (localStorage['person' + item.id]) {
                item = JSON.parse(localStorage['person' + item.id]);
            }
            if (JSON.stringify(item).toLowerCase().includes(q)) {
                results.push(item);
            }
        });
        return results;
    }
    )
);

Вы можете сделать это более читабельным и функциональным способом, подобным этому - используйте функцию Array.prototype.map для предполагаемого использования и добавьте фильтр:

return this.getAll().pipe(
    map(
        data => data
             .map(item => !!localStorage['person' + item.id]
                ? JSON.parse(localStorage['person' + item.id])
                : item)
             .filter(item => JSON.stringify(item).toLowerCase().includes(q))
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...