Извините, но я не понимаю, почему вам нужно создать новый Observable.
В такой ситуации вот что я привык делать:
@Effect()
login$ = this.actions$
.ofType<LoginAction.LoginAction>(LoginActions.LOGIN_ACTION)
.pipe(
map(action => action.payload),
switchMap(payload => {
return this.loginHttpService.login(payload)
.map(userLogged => {
return new LoginActions.LoginSuccessAction({user: userLogged});
})
.catch(error => {
return new LoginActions.LoginFailureAction(true);
});
})
);
@Effect()
loginSuccess$ = this.actions$
.ofType<LoginAction.LoginSuccess>(LoginActions.LOGIN_SUCCESS)
.pipe(
map(action => action.payload),
switchMap(payload => {
return this.permissionsService.loadPermissions(payload.user)
.map(permissions => {
return new LoginActions.PermissionsLoaded(permissions);
})
.catch(error => {
return new LoginActions.PermissionsLoadingFailed();
})
})
);
Если существующий метод loadPermissions
не возвращает Observable
, новый метод, как показано ниже, может выполнить работу:
loadPermissions(user): Observable<Permissions> {
return Observable.create(observer => {
loadPermissionsWithCallback(user, (response) => {
observer.next(response);
return observer.complete();
});
});
}
Это цепочка действий. LOGIN_ACTION -> LOGIN_SUCCESS -> PERMISSIONS_LOADED.
Пользователь полностью авторизован, когда отправлено действие PERMISSIONS_LOADED
.
Каждый метод обслуживания (login
и loadPermissions
) должен возвращать Observable, и это имеет место с новым HttpClientModule.
Конечно, это просто упрощенный и неполный пример ... Надеюсь, это вам немного поможет.