Как бороться с аутентифицированным состоянием в приложении SproutCore
В (теперь вроде как удаленном) вопросе fpk он задавался вопросом, где и как установить таймер для проверки подлинности пользователя.
Его вопрос является частью более крупного вопроса (который является названием этого вопроса). Поскольку я думаю, что важно, чтобы на этот вопрос был дан ответ, я создал новый вопрос как способ собрать всю важную информацию в одном месте.
1 ответ
Это типичный случай использования диаграммы состояний и, в частности, одновременных состояний.
Если вы еще не знали, SproutCore содержит очень полезную библиотеку под названием SC.Statechart, которая является способом управления состоянием приложения способом, который намного более управляем, чем через использование логических свойств, поскольку он также действует как ответчик, а также контроллер.
В этом случае вам нужна диаграмма состояний, которая в корне имеет два одновременных состояния: одно для обработки состояний, связанных с аутентификацией, и одно для работы с остальной частью приложения.
MyApp.statechart = SC.Statechart.create({
rootState: SC.State.design({
substatesAreConcurrent: true,
AUTH: SC.State.design({
initialSubstate: 'CHECKAUTH',
CHECKAUTH: SC.State.design({
}),
LOGIN: SC.State.design({
}),
AUTHENTICATING: SC.State.design({
}),
AUTHENTICATED: SC.State.design({
}),
}),
APPMAIN: SC.State.design({
})
})
});
Как это должно работать: Когда ваше приложение запускается, оно переходит в два состояния одновременно, одно из которых является состоянием APPMAIN, которое является состоянием, которое имеет дело с самим приложением. Второе - это состояние AUTH, которое немедленно перейдет в начальное подсостояние CHECKAUTH, которое проверяет, есть ли у пользователя действительный сеанс. Если нет, это состояние должно перейти в состояние LOGIN, которое отвечает за отображение экрана входа в систему. Когда пользователь затем выполняет вход в систему, состояние LOGIN переходит в состояние AUTHENTICATING, которое выполняет проверку сервера. Если эта попытка неверна или неверна, состояние AUTHENTICATING должно перейти в LOGIN, в противном случае в AUTHENTICATED.
Чтобы ответить на исходный вопрос, этот вопрос основан на: если вам нужен где-то таймер, который регулярно проверяет, действительна ли аутентификация, он должен быть в состоянии AUTHENTICATED. Если это не удастся, вы можете немедленно перейти в состояние LOGIN, чтобы отобразить экран входа в систему.
Использование такой диаграммы состояний предотвращает необходимость перезагрузки или выхода из приложения, чтобы войти в систему и, возможно, в результате потерять данные. Короче говоря, это делает пользовательский опыт намного лучше.