Я занимаюсь разработкой .NET, точнее WPF. Когда вы хотите вызвать действие с аутентификацией в C #, это примерно то, что вам нужно сделать.
var res = action();
if(res == Not authenticated)
{
var cred = await showDialog();
action(cred);
}
Довольно просто: вызовите действие, если вы не прошли аутентификацию, покажите диалоговое окно, в котором пользователь может ввести учетные данные и снова вызвать действие с учетными данными.
Сейчас я пытаюсь реализовать ту же функциональность в redux с epics.
export const pullCurrentBranchEpic = (action$: ActionsObservable<Action>, store: Store<ApplicationState>) =>
action$
.filter(actions.pullCurrentBranch.started.match)
.mergeMap(action => Observable.merge(
Observable.of(repoActions.authenticate.started({})),
waitForActions(action$, repoActions.authenticate.done)
.mergeMap(async _=>{
const repository = await getCurrentRepository(store.getState());
await pullCurrentBranch(repository);
})
.map(_=>actions.pullCurrentBranch.done({params:{},result:{}}))
.race(
action$.ofType(repoActions.authenticate.failed.type)
.map(() => actions.pullCurrentBranch.failed({error:"User not authenticated",params:{}}))
.take(1))
));
export const waitForActions = (action$, ...reduxActions) => {
const actionTypes = reduxActions.map(x => x.type);
const obs = actionTypes.map(type => action$.ofType(type).take(1));
return Observable.forkJoin(obs);
};
В основном epic обрабатывает действие (я даже не проверяю, должен ли пользователь быть аутентифицирован или нет, потому что он удвоит этот код), и действие запустит другое действие - Authenticate.started, которое изменит состояние в редукторе, чтобы открыть окно, пользователь сможет ввести свои учетные данные, и когда он это сделает, он вызовет действие Authenticate.done. Когда это будет сделано, epic продолжит обещание вызвать действие, которое вызовет другое действие, когда оно будет завершено. Я делаю что-то неправильно? Разве это не слишком сложно для такой простой вещи? Я не думаю, что это проблема с редукцией, а скорее с наблюдаемыми и эпическими редукциями.