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

1 回答 1

1

在这种情况下,我认为您应该在错误回调中处理错误,并且仅在错误不是您所期望的情况下才拒绝承诺。我的意思是,处理会话超时错误并拒绝其他所有内容的承诺。如果即使在处理错误后仍拒绝它,则将调用与承诺相关的所有错误回调(正如您自己注意到的那样)并且它们都不会处理会话超时错误(毕竟,您已经制作了一个拦截器来精确执行那)。

我支持在这种情况下使用更合适的状态代码的@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 上查看这个Angular 模块。

于 2013-08-06T03:03:02.110 回答