Obervable.create не запускается в angular5 с помощью ngrx - PullRequest
0 голосов
/ 03 июля 2018

Мой эффект:

  @Effect({dispatch: false})   /* sends request to httpService with params as login credentials on instance of loginAction. */
  login$: Observable<Action> = this.actions$
    .instanceOf(LoginActions.LoginAction)
    .switchMap(
      action => {
        return this.loginHttpService.login(action.payload)
          .map( (res: any) => {
            if (res && res.message !== 'Invalid Login') {
                const firstName = res.firstName;
                const lastName = res.lastName;
                this.tokenService.setToken(res.jwt);
                this.tokenService.setFirstName(firstName.charAt(0).toUpperCase() + firstName.slice(1));
                this.tokenService.setLastName(lastName.charAt(0).toUpperCase() + lastName .slice(1));
                this.tokenService.setId(res.id);
                this.tokenService.setAvatar(firstName.charAt(0).toUpperCase() + lastName.charAt(0).toUpperCase());

                const permissions = res.roles
                this.tokenService.setUserRoles(permissions)
                return Observable.create(observer => {
                  console.log('in observable')
                  this.permissionsService.loadPermissions(permissions, () => {
                    observer.next({
                      type: 'string'
                    });
                    console.log('here we go')
                    this.store.dispatch(new LoginActions.LoginSuccessAction({user: res}))
                    return observer.complete();

                  })
                })
            }
          })
          .catch( (e:any)  => {
            this.store.dispatch(new LoginActions.LoginFailureAction(true));

            return Observable.create(observer => {
              return observer.complete();
            }) 
        });
      });

Журнал in observable никогда не срабатывает. Что я делаю неправильно?

1 Ответ

0 голосов
/ 03 июля 2018

Извините, но я не понимаю, почему вам нужно создать новый 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.

Конечно, это просто упрощенный и неполный пример ... Надеюсь, это вам немного поможет.

...