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

接口异常的统一处理 #9

Open
tjuking opened this issue Nov 3, 2015 · 0 comments
Open

接口异常的统一处理 #9

tjuking opened this issue Nov 3, 2015 · 0 comments

Comments

@tjuking
Copy link
Owner

tjuking commented Nov 3, 2015

背景

前端需要面对各式各样的客户端环境,还需要考虑不同的网络状况。

接口的请求并不总是一帆风顺的,有可能在客户端这边出问题了,也有可能服务器端出问题了,甚至也有可能中间的传输过程出了问题。

所以需要对接口的异常进行捕获和处理以给用户更加有效的反馈,但如果项目中接口比较多的话,那我们就应该考虑如何去实现异常的统一处理了。

如何做

以依赖jQuery项目举例,通常是用$.ajax()方法去请求接口数据。

我们知道可以通过ajax的返回值再调用jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});来处理请求的异常(超时、中止、解析错误等),如下所示:

    $.ajax({
        ...
    }).fail(function(jqXHR, textStatus, errorThrown){
        if(textStatus == "timeout"){
            alert("请求超时");
        }else if(textStatus == "parsererror"){
            alert("数据解析失败");
        }else if(textStatus == "abort"){
            alert("请求被中止");
        }else{
            alert("请求出错:" + textStatus + "(错误码是" + jqXHR.status + ")");
        }
    });

可能在某个接口处理异常时是直接弹窗提示,有的接口可能需要在页面上打印出错信息,如何统一这种需求呢?

编写一个共用函数:

    function errorHandler(args, callback) {
        var description;
        var code;
        var message;
        var unknown = "未知";

        //容错处理
        if (args && args.length >= 2) {
            code = args[0].status || unknown;
            description = args[1] || unknown;
        } else {
            code = unknown;
            description = unknown;
        }

        //调用回调函数
        if (callback) {
            if(description == "timeout"){
                message = "请求超时";
            }else if(description == "parsererror"){
                message = "数据解析失败";
            }else if(description == "abort"){
                message = "请求未发出";
            }else{
                message = "请求出错:" + description + " (错误码:" + code + ")";
            }
            callback(message);
        }
    }

在实际接口中调用:

    $.ajax({
        ...
    }).fail(function(){
        errorHandler(arguments, function(message){
            alert(message);
        });
    });
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