Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一种实现简单且舒服的前端接口异常处理方案 #143

Open
hoperyy opened this issue Aug 1, 2019 · 0 comments
Open

一种实现简单且舒服的前端接口异常处理方案 #143

hoperyy opened this issue Aug 1, 2019 · 0 comments

Comments

@hoperyy
Copy link
Owner

hoperyy commented Aug 1, 2019

业务逻辑中,在处理接口数据的时候,除了要处理正常情况,也要处理异常情况。

处理方案多种多样,在这里介绍一个我常用的方案,在该方案中,业务代码只需处理数据正常的情况,无需处理:数据异常、接口请求报错(try catch)等。

以 Vue 项目为例。

该方案的开发体验

业务代码中的写法:

export default {
    async created() {
        const res = await this.getData();
        
        if (res !== null) {
            // 处理正常逻辑
        }
        
        // 如果 res 是 null,则不做任何处理
        // 隐藏的统一处理逻辑会负责错误提示等
    },
    
    methods: {
        getData() {
            return this.$ajax({
                // 各类参数
            })
        }
    }
}

效果:

  • 业务代码中只需要处理 res 不为 null 的情况,只要 res !== null (true)

    只要数据返回有值,只处理该情况即可。

  • 隐藏的统一处理逻辑会负责错误提示、返回数据格式化等

如何实现

实现方案也很简单。大家可以看到上面代码中用到了 this.$ajax

在 Vue 中就是新增一个 $ajax 插件即可。代码如下:

  • ajaxPlugin.js

    let $ajax = axios.create({
      // ... 各类配置
    });
        
    let $newAjax = (config) => {
        const $vm = this;
        
        return $ajax(config)
            .then(res => {
                // 这里统一处理异常情况
                // 同时也可以将数据返回值格式统一化
                
                if (res.code !== 200) {
                    $vm.$message.error(res.message);
                    return null;
                } else {
                    return {
                        data: res.data
                    };
                }
            }).catch(err => {
                $vm.$message.error(err);
                return null;
            });
    };
    
    export default {
        install(){
          Vue.prototype.$ajax = $newAjax;
        }
    };
  • index.js

    import ajaxPlugin from './ajaxPlugin';
    Vue.use(ajaxPlugin);

总结

我在多个项目中实现了这套处理逻辑,在实际的开发体验中,感觉非常不错。

在这里分享给大家。

@hoperyy hoperyy changed the title 一种稍微舒服的前端接口异常处理方案 一种实现简单且舒服的前端接口异常处理方案 Aug 1, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant