switchMap
следует использовать, когда вы хотите создать Observable, который вы можете отменить - в этом случае это addBlog
http-запрос. В этом случае вы, скорее всего, захотите mergeMap
вместо этого, поскольку, если вы попытаетесь добавить блог до того, как предыдущий блог будет закончен, он будет отменен. Смотри: https://blog.angularindepth.com/switchmap-bugs-b6de69155524
switchMap
требует, чтобы было выдано совместимое с Observable значение, поэтому вы не можете вернуть простой объект, такой как BlogAddedToDBAction
. Вместо этого вы можете сделать of(new BlogAddedToDBAction(action))
, поскольку of
создаст Observable, который испускает этот объект - однако это может быть не то, что вы хотите.
Effect
- это отдельный наблюдаемый поток, который испускает действия. Ваш поток только излучает CrudSuccessAction
.
Кажется, вы, вероятно, хотите испустить оба действия. Для этого вы можете использовать merge
. Тогда наблюдаемый эффект будет испускать каждое действие в последовательности. Я бы написал так:
@Effect() addBlog$: Observable<any> = this.actions$.pipe(
ofType<BlogAddedAction>(BLOG_ADDED_ACTION),
mergeMap(action => {
console.log(action)
return this.blogService.addBlog(action.payload.blog).pipe(
mergeMap(action => [new BlogAddedToDBAction(action), new CrudSucessAction(action)]),
catchError(() => of(new CrudErrorAction())
});
mergeMap
с массивом будет выдавать каждое значение массива. Вы можете подтвердить это с помощью простого теста:
of(1).pipe(mergeMap(() => [1, 2])).subscribe(console.log); // logs 1, then 2