Как заставить эффект ngrx ждать асинхронной функции

Я использую 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);
}
10 вопросов на собеседовании по React js
10 вопросов на собеседовании по React js
Вопрос: Что такое React JS? Каковы преимущества использования React?
4
0
5 535
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого помогает?

  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()))
  );

Другие вопросы по теме