Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角响应拦截器——处理承诺_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript 角响应拦截器——处理承诺

Javascript 角响应拦截器——处理承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我在下面创建了拦截器——当服务发送一个指示用户会话已过期的响应时,它基本上重定向到一个已知位置 它目前运行正常——我不确定的是是否拒绝承诺、返回响应,或者做一些不同的事情。如果我只是重定向,它会按预期工作。如果我拒绝了这个承诺,我将进入ajax调用的错误处理程序(未显示),但它会成功地重定向 在这种情况下,实现承诺的正确方式是什么 编辑:添加了else子句 var responseInterceptor = function ($q) { return function

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

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

在这种情况下,我认为您应该在错误回调中处理错误,并且只有在错误不是您期望的情况下才拒绝承诺。我的意思是,处理会话超时错误,拒绝承诺其他一切。如果即使在处理错误后仍拒绝它,那么所有与承诺相关的错误回调都将被调用(正如您自己所注意到的),并且没有一个会处理会话超时错误(毕竟,您已经为此创建了一个拦截器)

我支持@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控制台中就不会出现错误(即使这只是暂时的,因为页面会立即重定向)。