2013-08-05 88 views
0

我已經創建了下面的攔截器 - 它基本上重定向到一個已知位置時,該服務發送指示用戶的會話已過期的響應。角響應攔截 - 處理無極

它目前工作正常 - 什麼我不知道的是是否拒絕承諾,返回響應,或做不同的事情。如果我只是重定向,它按預期工作。如果我拒絕承諾,我最終會進入ajax調用的錯誤處理程序(未顯示),但它會成功重定向。

什麼是履行其在這種情況下諾言的正確方法是什麼?

編輯:添加了else子句。

var responseInterceptor = function ($q) { 
     return function (promise) { 
      return promise.then(function (response) { 
       if (response.data.SessionHasExpired == true) { 
        window.location.href = "/Home/Login?message=User session has expired, please re-login."; 
        return $q.reject(response); //do I need this? What to do here? 
       } 
       else { 
        return response; 
       } 

      }, function (response) { 
       return $q.reject(response); 
      }); 
     }; 
    }; 
+1

如果會話已過期,服務器可能不應成功響應(HTTP 200)。最好以[401 Unauthorized](http://httpstatus.es/401)狀態迴應。 – idbehold

回答

1

在這種情況下,我想你應該處理錯誤回調裏面的錯誤,只有拒絕承諾如果錯誤是不是您所期望的東西。我的意思是,處理會話超時錯誤並拒絕其他所有的承諾。如果在處理錯誤之後仍然拒絕它,則會調用與promise有關的所有錯誤回調(正如您自己已經注意到的那樣),並且它們都不會處理會話超時錯誤(畢竟,您爲攔截器做了精確的操作那)。

我支持使用一個更合適的狀態代碼,這種情況下的@idbehold建議。 401 Unauthorized是要走的路。

有了這一切正在考慮,你的代碼看起來是這樣的:

var responseInterceptor = function($q) { 
    return function(promise) { 
     var success = function(response) { 
      return response; 
     }; 
     var error = function(response) { 
      if (response.status === 401) { 
       window.location.href = "/Home/Login?message=User session has expired, please re-login."; 
      } 
      else { 
       return $q.reject(response);      
      } 
     }; 
     return promise.then(success, error); 
    }; 
}; 

也許你會有興趣在檢查出在Github上this角模塊。

+0

謝謝,我會研究看,如果服務器可以返回一個401 –

+0

在401的情況下,最好重定向後仍返回$ q.reject(響應)。這樣,JS控制檯中就不會有錯誤(即使它只是暫時的,看到該頁面立即被重定向)。 – ianbeks