#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()))
и удалите switchMap3. 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 я этого не знал.