javascript - 使用 HttpInterceptor 的 Angular 1.5 超时

标签 javascript angularjs timeout

全部,

我正在尝试设置一个全局 httpInterceptor,以便在出现客户端超时(而不是服务器超时)时显示自定义弹出消息。我找到这篇文章:Angular $http : setting a promise on the 'timeout' config ,并将其转换为 httpInterceptor,但它没有按预期工作,并且有一些奇怪的行为。

 $provide.factory('timeoutHttpInterceptor', function ($q, $translate, $injector) {

        var timeout = $q.defer();

        var timedOut = false;

        setTimeout(function () {
            timedOut = true;
            timeout.resolve();
        }, 10000);
        return {
            request: function (config) {
                config.timeout = timeout.promise;
                return config;
            },
            response: function(response) {
                return response;
            },
            responseError: function (config) {
                if(timedOut) {
                    var toastr = $injector.get('toastr');
                    toastr.custom('network', $translate('title'), $translate('label'), { timeOut: 5000000000000, closeButton: true, closeHtml: '<button></button>' });
                    return $q.reject({
                        error: 'timeout',
                        message: 'Request took longer than 1 second(s).'
                    });
                }
            },
        };
    });

最佳答案

您可以使用返回 promise 的$timeout服务并将其分配给config.timeout。看看下面的代码。

.factory('timeoutInterceptor', ['$q','$timeout', function($q,$timeout) {
    return {
      request: function(config) {
        //assign a promise with a timeout, and set timedOut flag, no need to trigger $digest, thus false as 3rd param
        config.timeout = $timeout(function(){ config.timedOut = true },2000,false);
        return config;
      },
      responseError :function(rejection) {
        if(rejection.config.timedOut){ //if rejected because of the timeout - show a popup 
            alert('Request took longer than 1 second(s).');
        }
        return $q.reject(rejection);
      }
    };

这是完整的工作示例:http://jsfiddle.net/2g1y4bk9/

关于javascript - 使用 HttpInterceptor 的 Angular 1.5 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40832962/

相关文章:

javascript - 使用 JavaScript 从给定目录获取图片

javascript - 使用AngularJS的OrderBy循环列表进行按索引升序排序的导航

javascript - 在将 jshint 与 grunt 一起使用时,如何摆脱嵌套太深的 block ?

java - 从输入流 Java 读取时有没有超时的方法?

javascript - 我需要扩展悬停显示 block 的最简单的 js 代码是什么,以便它在那里停留一秒钟

javascript - 如何使用 Angular 限制下拉菜单仅选择一个值?

javascript - 日期范围选择器 - 显示日历

javascript - 高阶函数有什么意义?

javascript - ons-dialog 数据绑定(bind)不起作用

php - "ON DUPLICATE KEY UPDATE"超时