Javascript 角响应拦截器——处理承诺
我在下面创建了拦截器——当服务发送一个指示用户会话已过期的响应时,它基本上重定向到一个已知位置 它目前运行正常——我不确定的是是否拒绝承诺、返回响应,或者做一些不同的事情。如果我只是重定向,它会按预期工作。如果我拒绝了这个承诺,我将进入ajax调用的错误处理程序(未显示),但它会成功地重定向 在这种情况下,实现承诺的正确方式是什么 编辑:添加了else子句Javascript 角响应拦截器——处理承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我在下面创建了拦截器——当服务发送一个指示用户会话已过期的响应时,它基本上重定向到一个已知位置 它目前运行正常——我不确定的是是否拒绝承诺、返回响应,或者做一些不同的事情。如果我只是重定向,它会按预期工作。如果我拒绝了这个承诺,我将进入ajax调用的错误处理程序(未显示),但它会成功地重定向 在这种情况下,实现承诺的正确方式是什么 编辑:添加了else子句 var responseInterceptor = function ($q) { return function
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);
});
};
};
在这种情况下,我认为您应该在错误回调中处理错误,并且只有在错误不是您期望的情况下才拒绝承诺。我的意思是,处理会话超时错误,拒绝承诺其他一切。如果即使在处理错误后仍拒绝它,那么所有与承诺相关的错误回调都将被调用(正如您自己所注意到的),并且没有一个会处理会话超时错误(毕竟,您已经为此创建了一个拦截器) 我支持@idbehold的建议,即在这种情况下使用更合适的状态代码<代码>401未经授权是一条出路 考虑到所有这些因素,您的代码可能如下所示:
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模块。如果会话已过期,服务器可能不会成功响应(HTTP 200)。最好让它以状态响应。谢谢,我将研究服务器是否可以返回401。对于401,最好在重定向后仍然返回$q.reject(响应)。这样,JS控制台中就不会出现错误(即使这只是暂时的,因为页面会立即重定向)。