2016-04-14 13 views
6

taşıma hatası:Angular2: HTTP Bir Angular2 merkezli Ionic2 uygulamasında, başarıyla Açısal 1.x interceptors ve sözlerini kullanılarak uygulanan aşağıdaki davranışı yeniden çalışıyorum

  1. Intercept HTTP isteği hataları
  2. Durum kodu 401 ise, o zaman

    a. müşteriyi kaydettirmek için başka bir istekte bulunun. Bu, her isteğe sonradan ekleyebileceğim bazı belirtiler sağlayacaktır.

    b. kayıt süreci: hata durumu sadece arayana normalde

NB aksın 401 dışında bir şey ise esas program İsteği yeniden deneyin ve

  • gözlemlenebilir vaadi yoluyla arayan/sonucu sağlamak Kullanıcıdan herhangi bir müdahaleye (giriş yok) ihtiyaç duymaz, bu yüzden kullanıcı için tamamen şeffaf olmasını istiyorum. Uygulama ilk kez yüklendiğinde bir kez kayıt olurum, ancak oturum sonunda zaman aşımına uğrayacak ve otomatik olarak yeniden kaydolmam gerekiyor.

    Bu orijinal Açısal 1 uygulamasıdır (I interceptor sadece responseError bölümünü kapsar):

    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; 
        } 
    } 
    

    Şimdi, Angular2 HTTP hizmetini erdi ve ben her bir başlık ekleme gibi basit şeyler yapabilirsiniz istek. Ancak aynı davranışı Angular2 ve Gözlemciler kullanarak yeniden üretmeye çalışıyorum.

    girişimim şimdiye kadar, bu hizmetlerim arayacak benim HTTP sancının istek yöntemidir:

    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; 
    } 
    
  • +0

    http://stackoverflow.com/questions/33941836/angular2-handling-http-response –

    +1

    @ Günter'ın bir kopyası gibi görünüyor: İlişkili ancak bir IMO değil. Sarmalayıcı içindeki hatayı işlemek ve onunla bir şeyler yapmak istiyorum, ardından tekrar deneyin. Hata geri bildirimini arayan kişiye geri göndermek istiyor. –

    +0

    Bu çözüm uygulandı mı? Ben de aynısını yapmaya çalışıyorum ama hiç başarı göstermeden. Eksiksiz bir çözüm gönderebilirseniz gerçekten yardımcı olur. – Abhinandan

    cevap

    5

    Sen yürütebilir tekrar istek sonra gözlenebilirlerin flatMap operatörü kullanılarak oturumu başlatmak:

    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; 
    } 
    
    +1

    Bunun anlamı nedir? Retry (3) 'nedir? Bir kez başarısız olsaydı istek 3 kez idam edildi mi? –

    +0

    Harika !!!! Teşekkürler ... Yeniden denemek (3) çalıştı – Romesh