У меня есть проект с этим кодом, который я унаследовал, и, хоть убей, я не могу понять, что именно происходит, и есть некоторые ошибки с профилем учителя, поэтому я пытаюсь разобраться, что разработчик, возможно, пытался делать. Если вы можете помочь, просмотрите и предоставьте какие-либо советы или проблемы, которые вы видите. Я хотел бы, чтобы этот код соответствовал лучшим практикам, и надеюсь, что следующим ребятам будет документировано, как это сделать.
Итак, мои вопросы:
Имеет ли смысл создавать новый BehaviorSubject при каждом вызове getTeacherProfile (), getTeacherProfileInfo (), getTeacherProfileByProfileId (), потому что это не создает новую переменную и никакие предыдущие подписчики не будут уведомлены?
Будет ли правильным лучшим шаблоном инициализировать один раз в конструкторе, например
this.broadCast = new BehaviorSubject<TeacherProfileModel>();
а затем внутри каждого метода, который хочет обновить, отправить, отправить любые новые данные для вызова:
this.broadCast.next(data);
Вместо подписки внутри методов получения Promise .then (), разве не является стандартной практикой делать все .subscribe ((data) = ›{внутри ngOnInit () один раз за жизненный цикл компонента?
Также нет ngOnDestroy () или отказа от подписки, что, я считаю, является стандартной практикой при подписке на любой BehaviorSubject, потому что, если вы этого не сделаете, это может вызвать утечки памяти и неожиданные результаты?
Может ли это быть вызвано порядком, в котором методы вызываются связанным кодом, который создает несогласованное взаимодействие с пользователем из зависимого кода, который подписывается на BehaviorSubjects, который может быть изменен / переназначен и забыт, что приведет к неожиданным и непредсказуемым результатам?
Заранее спасибо за помощь!
ВЫДЕРЖКИ КОДА
учитель.service.ts
async getTeacherProfile(): Promise<TeacherProfileModel> {
if (this.teacherProfileId > 0) {
var data = await this.crudService.get<TeacherProfileModel>("/tProfile/GetTeacherProfileData",
new HttpParams().set('teacherProfileId', this.teacherProfileId.toString())).toPromise();
this.broadCast = new BehaviorSubject<TeacherProfileModel>(data);
this.teacherProfile = data;
this.personalizedURL = this.teacherProfile.PersonalizedUrl;
}
else {
if (this.teacherProfileId === 0) {
this.initialiseTeacherProfile();
this.commonService.isDefaultImageFlag = true;
}
this.broadCast = new BehaviorSubject<TeacherProfileModel>(this.teacherProfileData);
}
return this.teacherProfile;
}
async getTeacherProfileInfo(url: string): Promise<TeacherProfileModel> {
var data = await this.crudService.get<TeacherProfileModel>("/teacherProfile/GetTeacherProfileInfo",
new HttpParams().set('personlizedUrl', url)).toPromise();
this.broadCast = new BehaviorSubject<TeacherProfileModel>(data);
this.teacherProfile = data;
this.personalizedURL = this.teacherProfile.PersonalizedUrl;
return this.teacherProfile;
}
async getTeacherProfileByProfileId(teacherProfileId:any): Promise<TeacherProfileModel> {
this.teacherProfileId = teacherProfileId;
this.imageUrl = localStorage.getItem("userImageUrl");
var data = await this.crudService.get<TeacherProfileModel>("/teacherProfile/GetTeacherProfileData",
new HttpParams().set('teacherProfileId', this.teacherProfileId.toString())).toPromise();
this.broadCast = new BehaviorSubject<TeacherProfileModel>(data);
this.teacherProfile = data;
this.personalizedURL = this.teacherProfile.PersonalizedUrl;
return this.teacherProfile;
}
profile.component.ts
ngOnInit() {
this.teacherService.getTeacherProfile().then((response: any) => {
this.teacherService.broadCast.subscribe(data => {
if(data !== undefined) {
//do something
}
});
});
}
учитель-профиль-edit.component.ts
previewChanges() {
this.commonService.userProfilePic = localStorage.getItem('userImageUrl');
this.commonService.isStudentUser = false;
this.teacherService.broadCast.next(this.teacherProfile);
}
private getTeacherProfileData() {
this.teacherService.getTeacherProfile().then((response: any) => {
this.teacherService.broadCast.subscribe(data => {
if(data !== undefined) {
this.teacherProfile = data;
this.onProfileStatusChange(this.teacherProfile.IsProfileStatusPrivate);
this.shortIntroLength = this.introLength - data.ShortIntroduction.length;
if (data.TeacherQualifications.length === 0) {
this.addQualification();
}
} else {
var err = 'Error'; this.toastr.error('Oops! Something went wrong! '+err); throw err;
}
});
});
}