Я новичок в наблюдаемой rxjs / redux и хочу сделать две вещи:
1) улучшите эту эпопею, чтобы она стала более идиоматичной
2) отправить два действия из одного эпоса
Большинство примеров, которые я вижу, предполагают, что библиотека api будет генерировать исключение при сбое выборки, но я разработал мой, чтобы быть немного более предсказуемым, и с типами объединения Typescript я вынужден проверить ok: boolean
Значение, прежде чем я смогу распаковать результаты, поэтому понимание того, как это сделать в rxjs, было немного сложнее.
Какой лучший способ улучшить следующее? Если запрос выполнен успешно, я хотел бы выдать как действие об успешном выполнении (имеется в виду, что пользователь авторизован), так и действие «получить учетную запись», которое является отдельным действием, поскольку в некоторых случаях может потребоваться получить учетную запись извне просто «войти». Любая помощь будет принята с благодарностью!
const authorizeEpic: Epic<ActionTypes, ActionTypes, RootState> = action$ =>
action$.pipe(
filter(isActionOf(actions.attemptLogin.request)),
switchMap(async val => {
if (!val.payload) {
try {
const token: Auth.Token = JSON.parse(
localStorage.getItem(LOCAL_STORAGE_KEY) || ""
);
if (!token) {
throw new Error();
}
return actions.attemptLogin.success({
token
});
} catch (e) {
return actions.attemptLogin.failure({
error: {
title: "Unable to decode JWT"
}
});
}
}
const resp = await Auth.passwordGrant(
{
email: val.payload.email,
password: val.payload.password,
totp_passcode: ""
},
{
url: "localhost:8088",
noVersion: true,
useHttp: true
}
);
if (resp.ok) {
return [
actions.attemptLogin.success({
token: resp.value
})
// EMIT action 2, etc...
];
}
return actions.attemptLogin.failure(resp);
})
);