Чтобы получить представление об этом вопросе, я рекомендую прочитать ветку ниже:
Я покажу контексты моего вопроса на стороне сервера и внешнего интерфейса:
Бэкэнд
- сервер flesjs;
- на сервере есть 3 сервиса: пользователи, оценки и студенты;
- используемый адаптер базы данных - sequelize для базы данных postgresql.
Внешний интерфейс
- Сборка рендеринга на стороне сервера в nuxt с vuetify;
- Feathers-vuex для управления состояниями.
- запрос страницы '/ profile' (интерфейс) для аутентифицированного пользователя ('/ users' в бэкэнде)
- страница '/ grades' (интерфейс) запрашивает запрос для всех оценок, принадлежащих аутентифицированному пользователю ('/ grades' в бэкэнде)
- страница '/ student' (интерфейс) запрашивает запрос для всех учащихся, принадлежащих к любым оценкам аутентифицированного пользователя ('/ студенты' в бэкэнде)
Итак, мой конкретный вопрос касается пункта 5 контекста внешнего интерфейса. С помощью следующего кода я могу получить всех учащихся, принадлежащих к любым оценкам прошедшего аутентификацию пользователя, но вычисленное свойство students
возвращает пустой массив:
<script>
import { mapState, mapGetters, mapActions } from 'vuex'
export default {
computed: {
...mapState('students', { areStudentsLoading: 'isFindPending' }),
...mapGetters('students', { findStudentsInStore: 'find' }),
query () {
return {
query: {
$sort: {
first_name: 1,
last_name: 1
},
$select: ['first_name', 'last_name'],
include: [{
model: 'grades',
where: {
userUuid: this.$store.state.auth.user.uuid
}
}]
}
}
},
computed () {
return this.findStudentsInStore(this.query).data
}
},
created () {
this.findStudents(this.query)
},
methods: {
...mapActions('students', { findStudents: 'find' })
}
}
</script>
Итак, findStudents
- это запрос AJAX, и в ветке комментариев кто-то ответит:
Axios (и AJAX в целом) является асинхронным, что означает, что операция начинается отдельно от обычного синхронного потока кода. После ее начала выполнение программы немедленно возобновляется, часто до завершения асинхронной операции. Пока вы входите в консоль, нет гарантии, что это асинхронное обещание еще не выполнено.
Кроме того, нет необходимости в этом геттере, который вы можете рассматривать как вычисляемый, который ничего не вычисляет.
Итак, я протестировал следующий код, в котором я заменил вычисляемое свойство student на данные студента, и он сработал:
<script>
import { mapActions } from 'vuex'
export default {
computed: {
query () {
return {
query: {
$sort: {
first_name: 1,
last_name: 1
},
$select: ['first_name', 'last_name'],
include: [{
model: 'grades',
where: {
userUuid: this.$store.state.auth.user.uuid
}
}]
}
}
}
},
data () {
return { students: [] }
},
created () {
this.findStudents(this.query).then((response) => {
this.students = response.data
})
},
methods: {
...mapActions('students', { findStudents: 'find' })
}
}
</script>
Итак, мой вопрос: есть ли способ обновить состояние учеников ОС в магазине, или я должен полагаться на последний подход?