Я пытался свести ваш вопрос к небольшой выборке, которую вы можете найти более здесь .
InitialState выглядит следующим образом:
initialState: {
roles: [],
isLoading: false
}
Как вы можете видеть, он имеет массив ролей, в который должны быть сохранены загружаемые роли, и логический isLoading
для условного отображения индикатора загрузки.
Теперь, когда мы настроили образецдавайте углубимся в детали.
Прежде всего, загрузка данных удаленно из действия возможна, но должна выполняться с осторожностью.Отгрузочный конвейер Aurelia Store представляет собой асинхронную очередь.Это означает, что новые действия будут автоматически поставлены в очередь в конце.Теперь, если выполняемое в настоящий момент действие занимает много времени, у вас могут возникнуть проблемы с запаздывающим пользовательским интерфейсом и т. Д., Поскольку все последующие действия обновляются только позже.
Во-вторых, действие должно создать одно новое состояние.То, что вы хотели бы сделать на самом деле, состояло бы из 3 действий.
- включите индикатор загрузки
- загрузите данные и обновите хранилище
- выключите индикатор загрузки
Так же, как в связанном примере, я бы предложил сделать это следующим образом:
export class App {
...
async loadRoles() {
// Activate the loader, await the action so you don't start loading before the new state is actually set
await this.store.dispatch(setLoader, true);
// Local to the function start loading the roles, so you don't block the action queue
const roles = await loadRoles();
// once the data is available update the roles
await this.store.dispatch(updateRoles, roles);
// once that is set disable the loader
await this.store.dispatch(setLoader, false);
}
}
async function loadRoles() {
return new Promise(resolve => {
setTimeout(() => {
resolve(["User role", "Admin role", "Superuser role"]);
}, 1000);
});
}
function setLoader(state, isLoading) {
return Object.assign({}, state, { isLoading });
}
function updateRoles(state, roles) {
return Object.assign({}, state, { roles });
}
Теперь эти 3 отправки также можно уменьшить до 2, поскольку установка данных плюсотключение загрузчика может пойти за один выстрел.Хорошая вещь в действиях состоит в том, что вы можете создать новую функцию, которая делает это точно, составляя новую из старых двух.
function updateRolesAndDisableLoader(state, roles) {
return Object.assign(
{},
updateRoles(state, roles),
setLoader(state, false)
);
}