【问题标题】:How to call action from action on Axios response Vuex?如何从 Axios 响应 Vuex 的操作中调用操作?
【发布时间】:2019-09-06 17:14:33
【问题描述】:

我正在尝试实现以下逻辑:调用登录,然后如果响应正常,则调用检索用户数据的方法。

登录操作

loginUser({commit,dispatch}, credentials) {
            const form = new URLSearchParams();
            form.append("login", credentials.login);
            form.append("password", credentials.password);

            const formConfig = {
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            };

         return  Axios.post(loginUrl, form, formConfig).then(
                (response) => {
                    commit('setErrorMessage', '', {root: true});
                    commit('setAuthenticated', response.headers[authorization]);
                    dispatch('getUserByLoginAuth',credentials.login);
                },
                (error) => {
                    if (error.response.status===500){
                        commit('setErrorMessage', error.response.data.message, {root: true});
                    } else {
                        commit('setErrorMessage', error.response.data, {root: true});
                    }

                });

        },

从上面派发的第二个动作:

getUserByLoginAuth({commit, getters}, login) {
            return getters.authenticatedAxios.get(userUrl + '/find', {
                params: {
                    login: login
                }
            }).then(
                (response) => {
                    commit('setErrorMessage', '', {root: true});
                    commit('setUser', response.data);
                },
                (error) => {
                    commit('setErrorMessage', error.response.data, {root: true});
                });
        },

仅从第二次调用此操作(据我了解,它与承诺有关)。

这是一个发送登录操作的组件代码

this.$store.dispatch('loginUser', this.credentials).then(() => {
                    this.errorMessage = this.getError;
                    if (this.errorMessage.length) {
                        this.errorOccurred = true;

                    }
                    this.$router.push({path: '/user/' + this.getId});
                });
                this.errorOccurred = false;
            },

我也不确定我是否在正确的位置进行路由。据我了解,然后将使用 getUser 的承诺,因此登录时的 errorMessage 可能会丢失。我想阻止它并从第一次正确发送 getUser

【问题讨论】:

    标签: javascript vue.js axios vuex


    【解决方案1】:

    我不完全按照你的要求,但这似乎是一个问题:

    dispatch('getUserByLoginAuth',credentials.login);
    

    问题不在于调用本身。问题是它启动了一个新的异步操作,而没有将其链接到现有的 Promise 上。从loginUser的角度来看,一切都做好了,就不会等getUserByLoginAuth了。

    结果将是组件中的then 将在getUserByLoginAuth 完成之前被调用。我想这就是为什么它似乎第二次起作用的原因,因为它正在从上一次调用中获取相关数据。

    解决办法就是把它改成:

    return dispatch('getUserByLoginAuth',credentials.login);
    

    通过放入return,它会将其添加到承诺链中,因此在getUserByLoginAuth 完成之前,loginUser 不会被视为完成。

    【讨论】:

    • 唯一的问题:我应该这样做 return Axios.post(loginUrl, form, formConfig).then( (response) => { return dispatch('getUserByLoginAuth',credentials.login); } ,
    • @AlexBondar 我提出的改变只是在该行的开头加上return这个词。其他一切都应该保持原样。您刚刚发布的代码似乎删除了对commit 的两次调用。没有必要删除这些。
    • 这种方式行不通,因为调度没有被调用
    • @AlexBondar 我不知道dispatch is not called in return 是什么意思。
    • 这一行 return dispatch('getUserByLoginAuth',credentials.login) 不起作用
    猜你喜欢
    • 2020-03-02
    • 2022-01-23
    • 2019-07-30
    • 2019-08-16
    • 2020-12-23
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多