Async/Await с отправкой Vuex

Я делаю загрузчик для некоторых компонентов в своем приложении.

Вот мой компонент:

        mounted() {
            this.loading = true;

            this.getProduct();
        },
        methods: {
            async getProduct() {
                await this.$store.dispatch('product/getProducts', 'bestseller');

                console.info(123);

                this.loading = false;
            }
        },

Действие Vuex:

getProducts({commit}, type) {
        axios.get(`/api/products/${type}`)
            .then(res => {
                let products = res.data;
                commit('SET_PRODUCTS', {products, type})
            }).catch(err => {
            console.info(err);
        })
    },

Проблема в этой строке: await this.$store.dispatch('product/getProducts', 'bestseller');

Я ожидаю, что код остановится на этой строке и дождется загрузки данных из вызова AJAX, а затем установит загрузку false;

Но это не так. Загрузка все еще установлена ​​false и console.info запускается до того, как мои данные будут готовы.

Я уже пытался переместить async/await в действие Vuex, и это сработало. Однако я не понял разницы между ними.

Ниже код работает для меня:

Компонент:

mounted() {
            this.loading = true;

            this.$store.dispatch('product/getProducts', 'bestseller').then((res) => {
                this.loading = false;
            });
        },

Действие Vuex:

async getProducts({commit}, type) {
        let res = await axios.get(`/api/products/${type}`);

        commit('SET_PRODUCTS', {products: res.data, type});
    }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
22
0
41 112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените это:

getProducts({commit}, type) {
    axios.get(`/api/products/${type}`)
        .then(res => {
            let products = res.data;
            commit('SET_PRODUCTS', {products, type})
        }).catch(err => {
        console.info(err);
    })
},

К этому:

getProducts({commit}, type) {
    return axios.get(`/api/products/${type}`)
        .then(res => {
            let products = res.data;
            commit('SET_PRODUCTS', {products, type})
        }).catch(err => {
        console.info(err);
    })
},

Должно сработать.

axios.get возвращает обещание. Вам нужно будет вернуть это обещание, чтобы позволить await дождаться его. В противном случае вы неявно возвращаете undefined, а await undefined немедленно разрешится.

«вы неявно возвращаете undefined, и await undefined немедленно разрешится». Это помогло в моем случае. Спасибо!

Thakur Karthik 13.01.2021 06:17

совершенно забыл вернуть обещание axios, спасатель жизни!

Amr SubZero 19.08.2021 08:15

оооо, я рад найти это решение, большое спасибо!

Nagisa Ando 24.08.2021 20:26

Вы не можете ждать функцию без обещания

await this.$store.dispatch('product/getProducts', 'bestseller');

Эта функция возвращает данные или вызывает новое действие

getProducts({commit}, type) {
    axios.get(`/api/products/${type}`)
        .then(res => {
            let products = res.data;
            commit('SET_PRODUCTS', {products, type})
        }).catch(err => {
        console.info(err);
    })
},

И эта функция возвращает обещание из-за асинхронной функции

async function return promise

async getProducts({commit}, type) {
    let res = await axios.get(`/api/products/${type}`);

    commit('SET_PRODUCTS', {products: res.data, type});

}

Теперь, используя вышеуказанную функцию, теперь вы можете использовать

await this.$store.dispatch('product/getProducts', 'bestseller');

с ключевым словом ожидания Или вы можете вернуть аксиомы, потому что аксиомы также возвращают промис.

Другие вопросы по теме