Объединяет последний не огонь из-за поведения субъекта?
Следующий код взят из моего сервисного компонента. Это требует, чтобы пользователь наблюдал и данные отправляли в BehaviorSubject. Я звоню form.service.formToSubmit$.next(form);
обновить его. потому что CombineLatest также срабатывает, когда пользователь наблюдает за ним, я проверяю, имеет ли formToSubmit значение NULL и установлен ли он в NULL после отправки. Но это не стрельба, когда я обновляю formToSubmit. Я пытался просто обо всем.
this.formToSubmit$ = new BehaviorSubject<Forms>(null);
constructor(){
this.updateForm();
}
updateForm(){
combineLatest(this.authService.user$, this.formToSubmit$).pipe(
switchMap(([user, form]) =>{
if(form == null) return;
return this.afs.collection('networks').doc(user.activeNetworkProfile.id).collection('companyProfiles').doc(user.activeCompanyProfile.id).collection('inspectionForms').doc(form.id).set(JSON.parse(JSON.stringify(form))).then(success=>{
this.formToSubmit$.next(null);
}).catch(err=>{
this.formToSubmit$.next(null);
});
})
);
}
Это предыдущий код, который работал просто отлично.
updateFormdd(form: Forms){
return Observable.create(observer=>{
this.authService.user$.subscribe(user=>{
this.afs.collection('networks').doc(user.activeNetworkProfile.id).collection('companyProfiles').doc(user.activeCompanyProfile.id).collection('inspectionForms').doc(form.id).set(JSON.parse(JSON.stringify(form))).then(success=>{
observer.next(success);
observer.complete();
}).catch(err=>{
observer.err(err);
});
})
})
}
Но в конечном итоге цель состоит в том, чтобы выяснить, как выполнить вышеупомянутую функцию, но позволить мне объединить до 3 наблюдаемых, как в следующей функции.
updateInspection(){
combineLatest(this.authService.user$, this.equipmentId$, this.inspectionToSubmit$).pipe(
switchMap(([user, equipmentId, form]) =>{
if(form == null) return;
return this.afs.collection('networks').doc(user.activeNetworkProfile.id).collection('companyProfiles').doc(user.activeCompanyProfile.id).collection('equipment').doc(equipmentId).set(JSON.parse(JSON.stringify(form))).then(success=>{
this.formToSubmit$.next(null);
}).catch(err=>{
this.formToSubmit$.next(null);
});
})
);
}
Я просто хочу убедиться, что я правильно использую наблюдаемые. Спасибо
1 ответ
Ключ разницы между вашими двумя частями кода - это "подписка".
Рабочая версия имела подписку. Поскольку ваши наблюдаемые являются холодными наблюдаемыми, они не будут излучать, пока на них что-то не подписано.
Выясните, где вы хотите использовать это наблюдаемое, а затем добавьте туда подписку.
this.formToSubmit$ = new BehaviorSubject<Forms>(null);
constructor(){
let mySubscription = this.updateForm().subscribe(
(dataFromCombineLatest) => {
// This subscription should cause the code inside the combine to fire
}
);
Кроме того, если это внутри "компонента", я рекомендую запускать этот бит в "onInit" вместо конструктора (мне нравится мой код конструктора, чтобы быть бережливым).