微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

typescript – Angular2:HTTP错误处理

我试图重现以下基于Angular2的Ionic2应用程序中使用Angular 1.x拦截器和承诺成功实现的行为:

>拦截HTTP请求错误
>如果状态代码是401,那么

一个.再提出注册客户的请求.这将提供一些我随后可以附加到每个请求的令牌.

湾重试orignal请求并通过promise / observable将结果提供给调用
>如果错误状态是401以外的任何其他状态,请将流程正常地传递给调用

注意:注册过程不需要用户的任何干预(无需登录),因此我希望它对用户完全透明.我首次加载应用时注册一次,但会话最终会过期,我需要自动重新注册.

这是原始的Angular 1实现(我只包含拦截器的responseErrorpart):

responseError : function(rejection){
    if(rejection.status == 401){
        $log.info('Intercepting unauthorized 401 response. Will try to re-register the session and retry the request.');

        var security = $injector.get('SecurityService');
        var $http = $injector.get('$http');

        return security.registerSession().then(function(){
            return $http(rejection.config);
        });

    }else{
        return rejection;
    }
}

现在,我已经包装了Angular2的HTTP服务,我可以做一些简单的事情,比如为每个请求添加一个标头.但是,我正在努力使用Angular2和Observables重现相同的行为.

到目前为止我的尝试,这是我的服务将调用Http包装器的请求方法

request(url: string | Request,options?: RequestOptionsArgs): Observable<Response> {

    let req: Request = this.buildrequest(url,options);

    this.beforeCall(req);

    var observable = this.http
        .request(req)
        .retry(3)
        .catch(res => {
            debugger;
            console.log("ERROR! " + res.status);
            if(res.status == 401){
                this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
                return this.securityService.registerSession().subscribe(() => {
                    // What to do here so the client gets the result of the original request ??
                });
            }
        })
        .do((res:Response) => { this.afterCall(req,res) });

    return observable;
}
在使用observables的flatMap运算符初始化会话后,您可以再次执行请求:
var observable = this.http
        .request(req)
        .retry(3)
        .catch(res => {
            debugger;
            console.log("ERROR! " + res.status);
            if(res.status == 401){
                this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
                return this.securityService.registerSession().flatMap(() => {
                  return this.http.request(req); // <--------
                });
            }
        })
        .do((res:Response) => { this.afterCall(req,res) });

    return observable;
}

原文地址:https://www.jb51.cc/angularjs/141234.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐