Ваш код правильный, и в этом случае нет необходимости использовать BehaviorSubject
или Subject
.
Для лучшего понимания различий см. https://coryrylan.com/blog/rxjs-observables-versus-subjects
Но вкратце, это Наблюдаемый, и наблюдатель
import { Observable } from 'rxjs';
const observable = new Observable(observer => {
setTimeout(() => observer.next('hello from Observable!'), 1000);
});
observable.subscribe(v => console.log(v));
и Субъекты наследуются от Наблюдаемой и имеют вид
import { Subject } from 'rxjs';
const subject = new Subject();
subject.next('missed message from Subject');
subject.subscribe(v => console.log(v));
subject.next('hello from subject!');
обратите внимание, что вы можете назвать next
на предмете, (вам нужно сделать то же самое с помощью обозревателя в наблюдаемом)
также до сих пор вы не можете получить доступ к последнему предоставленному значению, поэтому BehaviorSubject
для этого, он унаследован от Subject
и имеет значение, также время, когда вы создаете его экземпляр, выдаст первое значение в конструкторе
import { ReplaySubject } from 'rxjs';
const behaviorSubject = new BehaviorSubject(
'hello initial value from BehaviorSubject'
);
behaviorSubject.subscribe(v => console.log(v));
behaviorSubject.next('hello again from BehaviorSubject');
И Subject
, и BehaviorSubject
имеет complete
меню для завершения подписки.
также время, когда вы подписаться на BehaviorSubject
он будет выдавать последнее значение.
Улучшение кода
относительно вашего кода есть некоторые улучшения, как показано ниже
weather.model.ts
export interface Weather {
date: Date;
temp: number;
tempMin: number;
tempMax: number;
tempFelt: number;
pressure: number;
humidity: number;
weatherDesc: string;
weatherIcon: string;
clouds: number;
windSpeed: number;
windOrientation: number;
}
сервис
getWeather(city): Observable<Weather[]> {
return this.httpClient.get(`${this.URI}${city}${this.APIKEY}`)
.pipe(
map((data: any) => data.list.map(item => ({
date: item.dt,
temp: item.main.temp,
tempMin: item.main.temp_min,
tempMax: item.main.temp_max,
tempFelt: item.main.feels_like,
pressure: item.main.pressure,
humidity: item.main.humidity,
weatherDesc: item.weather[0].main,
weatherIcon: item.weather[0].icon,
clouds: item.clouds.all,
windSpeed: item.wind.speed,
windOrientation: item.wind.deg
}))
);
}