Я предполагаю, что ничего не происходит, потому что когда вы запускаете метод save, из authState ничего не выходит. Очевидно, вы ожидаете, что наблюдаемое authState или Subject всегда будет вызывать какой-либо вывод, что имеет место только в определенных случаях.
Код ниже создает -new- наблюдаемый, который слушает authState.
return this.auth.authState.pipe(map(res =>
<Story>{
title: form.title, content: form.content, createdAt: new Date(), sid: key,
uid: res.uid, username: res.displayName
}
)).toPromise().then((story: Story) =>
this.afStore.doc(`stories/${key}`).set(story).catch(err => err.message));
Этот код запускается только методом сохранения. Я предполагаю, что authState является либо наблюдаемым, либо предметом. Ваш код будет работать только тогда, когда authState передается новое значение -after- метод save запущен.
Ваш код, который использует фиктивный объект, работает, потому что вы создаете наблюдаемую, которая сразу же генерирует это одно значение.
Если объект authState: заменить его на ReplaySubject (1)
Если это наблюдаемая, вам нужно опубликовать ее как ReplaySubject, например:
authState.pipe(
publishReplay(1),
refCount()
);
Чтобы полностью понять, что происходит, прочитайте эту статью:
https://blog.mindorks.com/understanding-rxjava-subject-publish-replay-behavior-and-async-subject-224d663d452f
Это Java-статья, но применяются те же принципы.
Но, честно говоря, я съеживаюсь, когда вижу, что люди используют метод toPromise
Вы бы выучили rxjs намного быстрее, если бы использовали его по назначению!
Если бы я написал этот код, он бы выглядел примерно так:
public save$: Subject<StoryForm> = Subject<StoryForm>();
private destroy$: Subject<any> = new Subject();
ngOnDestroy(): void {
this.destroy$.next();
}
onInit() {
// the (click) eventhandler in your GUI should call save$.next(storyForm)
// this will trigger this statement
this.save$.pipe(
// withLatestFrom will fetch the last value from an observable,
// it still needs to be a ReplaySubject or ReplaySubject for this to work though!
// it will pass an array down the pipe with the storyForm value, and the last value from authState
withLatestFrom(this.auth.authState),
// switchMap does the actual work: note that we do not return a value,
// but an observable that should that return a value soon, that is why we need switchMap!
switchMap(([storyForm, authInfo]) => {
// i am assuming the "set" method returns an observable
// if it returns a Promise, convert it using fromPromise
return this.afStore.doc(`stories/${key}`).set(story).pipe(
// catchError needs to be on your api call
catchError(err => console.log(err))
);
}),
// this will kill your subscriptino when the screen dies
takeUntil(this.destroy$)
).subscribe(value => {
// "value" will be the return value from the "set" call
this.router.navigate(['/stories']);
}
}