Я использую 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);
}
Что-то вроде этого помогает?
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()))
);