AngularJS:$ http fire and forget(no $ apply)

时间:2017-10-25 12:45:50

标签: javascript angularjs http exception

我的自定义异常处理程序每​​当发生异常时都会在$http上发送一个日志记录事件(类似于文档https://docs.angularjs.org/api/ng/service/ $ exceptionHandler中的示例)。

angular.
  module('exceptionOverwrite', []).
  factory('$exceptionHandler', ['$log', '$http', function($log, $http) {
    return function myExceptionHandler(exception, cause) {

      $http.post('myUrl.com/logErrors', cause);
      $log.warn(exception, cause);

    };
  }]);

这可以按照需要运行......除非它没有:

问题:

Angular使用数据绑定将逻辑从控制器绑定到视图。然而,这似乎在这个星座中引起无穷大 - 循环:。

  1. 只要在以这种方式绑定到视图的函数中发生错误,就会触发异常处理程序(根据需要)。
  2. 日志记录事件通过$ http
  3. 发送
  4. 服务器以某些HTTP状态代码
  5. 响应
  6. AngularJS尝试使用$ http-response更新我的观点并调用$apply(!!)
  7. 绑定到视图的所有函数都会重新评估
  8. 除非导致步骤1中的异常的条件现在神奇地消失,否则抛出另一个异常,我们将在第1步重新开始。
  9. 问题:

    当服务器响应时,如何阻止$http执行$apply?在这种情况下,一个简单的“即发即弃”机制就足够了,我不关心服务器响应。

    我做错了(还是我误解了循环的原因)?由于这基本上是自定义exceptionHandlers的angular-docs的基础示例,我真的很困惑,为什么它会在一个非常常见的用例中崩溃。

1 个答案:

答案 0 :(得分:0)

好像你有类似的东西:

<div ng-bind="service.calculate()"></div>

然后它将运行每个摘要周期并产生错误。

从html中删除任何调用,这实际上是一种很好的做法 - 函数应仅在事件处理程序(ng-click)中添加,在ng-if,ng-repeat,ng-show中,...应该引用变量。 (还要避免使用过滤器,除非它们非常简单且时间便宜)