角度响应拦截器 - 处理承诺

时间:2013-08-05 18:56:26

标签: javascript angularjs promise

我已创建了下面的拦截器 - 当服务发送指示用户会话已过期的响应时,它基本上会重定向到已知位置。

它目前正常工作 - 我不确定是否拒绝承诺,返回响应或做一些不同的事情。如果我只是重定向,它按预期工作。如果我拒绝承诺,我最终会进入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 个答案:

答案 0 :(得分: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 Angular模块。