Объединяет последний не огонь из-за поведения субъекта?

Следующий код взят из моего сервисного компонента. Это требует, чтобы пользователь наблюдал и данные отправляли в 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" вместо конструктора (мне нравится мой код конструктора, чтобы быть бережливым).

Другие вопросы по тегам