async/await 处理 promis

请求函数 reqLogin(user) 返回一个 promise 对象,如果我们要获取该 promise 对象的值 PromiseResult,我们就需要用到 async/await 。

因为这个请求函数可能返回三个值 1、成功态 2、失败态 3、请求失败:AxiosError

(某些请求里面,其中成功态又分为任务失败或者任务成功,用 result.code 区分)

完整功能模板:

async login(context,user) {
    try {
        let result = await reqLogin(user);

        if(result.code == 200) {

            // result为 成功态的值 并且任务完成
            
        } else if(result.code == 207) {
            
            // result为 成功态的值 并且任务失败

        } else {
            
            // 发送请求失败 result 为一个 AxiosError
            
        }

    } catch (error) {
        // error 为失败态的值
        console.log(error);
    }
},

简化功能模板:

async logout() {
    let result = await reqLogout();

    if(result.code == 200) {
        // 当成功态并且 code == 200
        ......

    } else {
        // 失败态或请求失败返回 自定义失败态 promise
        return Promise.reject(new Error('退出登录失败'));
    }
}
// 调用端
async logout() {
    try {
        await this.$store.dispatch('user/logout');

        // 成功态处理

    } catch (error) {
        // 失败态打印
        console.log('退出登录失败');
    }
}
6.2.1 关于登录业务的案例

首先明确发送完一个登录的请求 reqLogin(user),可以获取到什么数据:

// result为 成功态的值 并且任务完成

{
    "code": 200,
    "message": "成功",
    "data": {
        "nickName": "185123",
        "name": "185123",
        "userId": 6036,
        "token": ""
    },
    "ok": true
}
// result为 成功态的值 并且任务失败

{
    "code": 207,
    "message": "账号不正确",
    "data": null,
    "ok": false
}
// result 为一个 AxiosError

{
    "message": "Request failed with status code 404",
    "name": "AxiosError",
	......
    "status": 404
}
// error 为失败态的值
...

那么在 vuex 里面是这样处理的

store/user.js

async login(context,user) {
    try {
        let result = await reqLogin(user);

        // result为 成功态的值 并且任务完成
        if(result.code == 200) {

            localStorage.setItem('token', result.data.token); // 本地存储 token

            return {message: '登录成功'};

        // result为 成功态的值 并且任务失败
        } else if(result.code == 207) {

            return result; // 里面带有 message

        // 发送请求失败 result 为一个 AxiosError
        } else {
            return {message: '登录失败'}
        }

        // error 为失败态的值
    } catch (error) {
        console.log(error);

        return {message: '登录失败'}
    }
},

这个函数直接返回的是一个 promise,且一定为成功态,里面有属性 message

在组件的登录函数是这样调用 vuex 的

简单逻辑,没有加正则

async login() {
    if(this.phone && this.password ) {
        let result = await this.$store.dispatch('user/login',{
            phone: this.phone,
            password: this.password,
        });

        // 打印不同的 result.message
        alert(result?.message);

        // 登录成功跳转
        if(result.code == 200) this.$router.push("/");

    } else {
        alert('请填写正确信息');
    }
}
GitHub 加速计划 / vu / vue
207.52 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:1 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 3 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 3 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐