Typescript Angular2:HTTP错误处理

Typescript Angular2:HTTP错误处理,typescript,angular,rxjs,Typescript,Angular,Rxjs,我尝试在基于Angular2的Ionic2应用程序中,使用Angular1.x拦截器和promises成功实现以下行为: 拦截HTTP请求错误 如果状态代码为401,则 a。再次请求注册客户端。这将提供一些令牌,我可以随后附加到每个请求 b。重试原始请求,并通过promise/observable将结果提供给调用方 如果错误状态不是401,就让它正常地流向调用者 注意:注册过程不需要用户的任何干预(无需登录),因此我希望它对用户完全透明。我在第一次加载应用程序时注册了一次,但会话最终将过期,我需

我尝试在基于Angular2的Ionic2应用程序中,使用Angular1.x拦截器和promises成功实现以下行为:

  • 拦截HTTP请求错误
  • 如果状态代码为401,则

    a。再次请求注册客户端。这将提供一些令牌,我可以随后附加到每个请求

    b。重试原始请求,并通过promise/observable将结果提供给调用方

  • 如果错误状态不是401,就让它正常地流向调用者

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

    这是最初的Angular 1实现(我只包括拦截器的
    responseError
    部分):

    现在,我已经包装了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;
    }
    
    request(url:string | request,options?:RequestOptionsArgs):可观察{
    let req:Request=this.buildRequest(url,选项);
    此。调用前(req);
    var observable=this.http
    .请求(req)
    .重试(3)
    .catch(res=>{
    调试器;
    console.log(“错误!”+res.status);
    if(res.status==401){
    this.logger.log('未经授权的请求。正在尝试注册会话,然后重试请求');
    返回此.securityService.registerSession().subscribe(()=>{
    //在这里该怎么做才能让客户端获得原始请求的结果??
    });
    }
    })
    .do((res:Response)=>{this.afterCall(req,res)});
    可观测收益;
    }
    
    初始化会话后,您可以使用可观察对象的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;
    }
    
    var observable=this.http
    .请求(req)
    .重试(3)
    .catch(res=>{
    调试器;
    console.log(“错误!”+res.status);
    if(res.status==401){
    this.logger.log('未经授权的请求。正在尝试注册会话,然后重试请求');
    返回此.securityService.registerSession().flatMap(()=>{
    返回this.http.request(req);//{this.afterCall(req,res)};
    可观测收益;
    }
    
    看起来像是@Günter:Related的dup,但不是dupe IMO。我想在包装器中处理错误并对其进行处理,然后重试。他想向调用者返回错误反馈。此解决方案是否已实施?我一直在尝试执行相同的操作,但没有任何成功。如果您可以发布完整的解决方案。这意味着什么
    重试(3)
    ?如果一次失败,请求执行3次?
        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;
    }