Как я могу выполнить дальнейшую обработку в этом конвейере rxjs?

#angular #rxjs #rxjs5

#angular #rxjs #rxjs5

Вопрос:

Я выбираю погодную форму Yahoo и хочу извлечь из ответа только несколько полей. Я думал, что это может сработать, но это не так, как я могу добиться получения ответа JSON, а затем выполнить еще немного работы, чтобы вернуть объект только с несколькими полями?

   constructor(private http: Http) { }

  getWeather(): Observable<any> {
    return this.http
        .get(this.url)
        .map((resp:Response) => resp.json())
        .switchMap((json) => this.tranformJson(json))
        .catch(this.handleError);
  }

  private tranformJson(json) {
    let result = {};
    const r = json.query.results.channel;
    const current = r.item.condition.temp;
    const f = r.item.forecast[0];
    const { high, low, text} = f;
    result['high'] = high;
    result['low'] = low;
    result['text'] = text;
    result['currentTemp'] = current;
    return resu<
  }
  

Комментарии:

1. Не используйте switchMap(). Используйте map(). И создайте класс или интерфейс для вашего результирующего объекта, чтобы вы могли возвращать наблюдаемое<SomethingMeaningful> .

2. измените свою карту на эту .map((resp:Response) => this.tranformJson(resp.json())) и удалите switchMap

3. ok объединил оба из них, чтобы правильно преобразовать ответ. Принял бы либо в качестве ответа.

Ответ №1:

Как насчет:

   getWeather(): Observable<any> {
    return this.http
        .get(this.url)
        .map((resp:Response) => resp.json())
        //You are only using the channel field so pluck it out
        .pluck('query','results','channel')
        // Use map instead of switchMap
        .map(this.transform)
        .catch(this.handleError);
  }

  private static transform({item: {forecast, condition}}) {
    const [{high, low, text}] = forecast;
    return {
      currentTemp: condition.temp,
      high,
      low,
      text
    };
  }
  

Комментарии:

1. Это идеально, я тоже не знал о pluck, что идеально подходит для этого сценария

2. Небольшая ошибка в коде, поскольку функция помечена как статическая, это не this.transform это будет имя класса. преобразовать

Ответ №2:

В вашей функции transformJson() вы инициализируете переменную result пустым объектом и никогда не присваиваете ей никаких значений. В конце вы возвращаете и пустой результат.

Комментарии:

1. вы правы, я отредактировал свой вопрос после того, как заметил, что

2. Другая проблема заключается в том, что аргумент switchMap недоступен для наблюдения. switchMap — это переключение с одного наблюдаемого объекта на другой, но ваш transformJson() возвращает объект.

3. Спасибо за ваш комментарий и указание на то, что о switchMap я этого не знал.