【问题标题】:Angular Response Interceptor--Handling Promise角响应拦截器--处理Promise
【发布时间】:2013-08-05 18:56:25
【问题描述】:

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

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

【问题讨论】:

  • 如果会话已过期,服务器可能无法成功响应 (HTTP 200)。最好让它以401 Unauthorized 状态响应。

标签: javascript angularjs promise


【解决方案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 模块。

【讨论】:

  • 谢谢,我会看看服务器是否可以返回 401。
  • 在401的情况下,重定向后最好还是返回$q.reject(response)。这样,JS控制台就不会出现错误(即使它只是暂时的,因为页面会立即重定向)。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2017-02-08
  • 2021-05-28
  • 2018-01-05
相关资源
最近更新 更多