Rxjs6 от rxjs5: обработка наблюдаемых в методе REST API

Я новичок в rxjs и Angular, и я только что обнаружил (благодаря моему WebStorm, выдающему множество красных сообщений об ошибках), что rxjs5 сильно отличается от версии 6.

Итак, я следую этому руководству, которое направляет пользователей через сборку службы API с помощью rxjs. Проблема в том, что он написан для версии 5.

Вот пример маршрута API, написанного в версии 5:

public getAllTodos(): Observable<Todo[]> {
  return this.http
   .get(API_URL + '/todos')
   .map(response => {
     const todos = response.json();
     return todos.map((todo) => new Todo(todo));
   })
   .catch(this.handleError);
}

После прочтения документации я переписал маршрут версии 6 до этой точки:

public getAllTodos(): Observable<Todo[]> {
  return this.http
   .get(API_URL + '/todos')
   .pipe(
     map(response => {
      return response.map((todo) => new Todo(todo));
     }),
     catchError(this.handleError)
  );
}

Проблема в том, что я получаю:

Свойство «карта» не существует для типа «Объект».

Я предполагаю, что это связано с тем, что ответ не в формате json, хотя ответ, похоже, не имеет метода .json ().


person Ravioli87    schedule 31.07.2018    source источник
comment
pipe ( tap(v => console.log(v))) - ваш друг. Проверьте все, что вы наблюдаете на этом этапе, и соответствующим образом адаптируйте код.   -  person c69    schedule 31.07.2018
comment
Для angular идиоматический способ (с использованием HttpClient) - return this.http.get<Todo[]>(url).pipe( map( res => res.map(todo => new Todo(todo)), catchError(handleErr) ); - обратите внимание на общий get.   -  person c69    schedule 31.07.2018


Ответы (1)


Причина ошибки в том, что если вы не укажете тип переменной response, предполагается, что это объект. Поскольку map является функцией массива, вам необходимо указать тип вашего ответа как массив:

this.http.get<any[]>(...).pipe(...); // Preferred

or:

this.http.get(...).pipe(map((response: any[]) => ...)...);

Обратите внимание, что вы должны заменить any в приведенном выше фактическом типе, который возвращается из вашего API (строка, объект и т. Д.).

person Simon K    schedule 31.07.2018