Как заставить эффект ngrx ждать асинхронную функцию - PullRequest
1 голос
/ 08 апреля 2019

Я использую node-keytar для хранения токенов в приложении Electron. Он использует обещания, поэтому мне нужно дождаться разрешения Обещания, чтобы получить токен.

Эффект, который я пытаюсь создать, вызовет службу аутентификации для получения токена, а затем отправит этот токен в бэкэнд-API с помощью вызова Angular http. Проблема здесь заключается в вызове сервисной функции в Effect. Поскольку сервисной функции нужно await, ответ keytar, вся функция должна быть async, но, насколько я понимаю, невозможно сделать сам эффект асинхронным с ключевым словом async.

Есть ли другая архитектура, которую я должен использовать здесь? Я пытался использовать .then() и возвращать успешное действие изнутри, но это приводит к ошибкам типа.

Эффект (который в настоящее время имеет ошибку Type Observable<{}> is not assignable to type Observable<Action>):

  setAccount$: Observable<Action> = this.actions$.pipe(
    ofType<SetCurrentAccountPending>(AccountActions.ActionTypes.SetCurrentAccountPending),
    switchMap(action => {
      return this.accountService.setCurrentAccount(action.payload).pipe(
        map(
            () => new AccountActions.SetCurrentAccountSuccess(action.payload)
          ),
          catchError(() => {
            return of(new AccountActions.SetCurrentAccountFailure());
          })
        );
    })
  );

Сервисная функция:

async setCurrentAccount(id: string) {
    const password = await AccountHandler.getPasswordFromManager(id);
    const body = {password: password};
    return this.httpClient.post(environment.localApi + '/accounts/' + id, body);
}

1 Ответ

1 голос
/ 09 апреля 2019

Помогает ли что-то подобное?

  setAccount$: Observable<Action> = this.actions$.pipe(
    ofType<SetCurrentAccountPending>(AccountActions.ActionTypes.SetCurrentAccountPending),
    switchMap(action => this.accountService.setCurrentAccount(action.payload)),
    map(data => new AccountActions.SetCurrentAccountSuccess(data)),
    catchError(error => of(new AccountActions.SetCurrentAccountFailure()))
  );
...