【问题标题】:Stop Execution of angular $timeout after $http interceptor is called调用 $http 拦截器后停止执行角度 $timeout
【发布时间】:2016-04-27 20:47:04
【问题描述】:

我正在使用 $httpProvider.interceptors 来捕获 401 或 403 请求,然后我结束会话并重定向到登录页面。有一个具有超时功能的函数,如果我收到 401 或 403 响应,我想停止执行此超时

【问题讨论】:

    标签: angularjs timeout interceptor


    【解决方案1】:

    你可以很容易地取消超时

    var myTimeout = $timeout(function() {}, 1000);
    // Check http status code
    if (someHttpCode === 401){
      // Stop the timeout
      $timeout.cancel(myTimeout);
    }
    

    【讨论】:

    • 取消的能力并不是“因为它返回了一个承诺”。一般来说,没有办法取消承诺,这是超时添加到承诺的额外功能。另外值得注意的是,最新版本的 angularjs 不需要您传递空函数,您只需调用 $timeout(1000) 即可获得承诺。
    • @Duncan 感谢您的更正,我会记住这一点
    • 我知道我们可以通过将超时保存在一个变量中来取消它,我只是想知道是否有一个全局方法可以一次清除所有挂起的超时而不将其保存在任何变量中
    • 不,据我所知,angularjs 没有全局清除所有超时,您需要使用我上面显示的方法
    【解决方案2】:

    您可以使用$timeout.cancel(timer) 来停止计时器。

    在文档中阅读有关它的更多信息: $timeout

    【讨论】:

    • 您应该在回答中提供一些上下文和解释,而不仅仅是文档链接。还要引用文档的相关部分,以防将来链接失效。见stackoverflow.com/help/how-to-answer
    【解决方案3】:

    你需要保存计时器,比如this:

    var myVar;
    
    function myFunction() {
        myVar = setTimeout(function(){ alert("Hello"); }, 3000);
    }
    
    function myStopFunction() {
        clearTimeout(myVar);
    }
    

    【讨论】:

    • 这就是为什么我留下了 w3 的链接?
    • 我不知道你为什么认为你需要强调它
    • 投了反对票,因为这个问题显然是关于角度的,所以不适合使用setTimeout
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 2014-10-25
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多