javascript - 解析中的异步调用失败

标签 javascript angularjs

我已将以下内容添加到我的 app.config 中,以便在允许我的任何路由启动其关联 Controller 之前解析全局需要的变量。这一直工作得很好,但是我担心这个异步调用发生的情况。如果发生这种情况,这将无法正确解决,并且我的应用程序将永远不会呈现。我该如何防范这种情况?

var originalWhen = $routeProvider.when;

$routeProvider.when = function(path, route) {
  if (!route.resolve) {
    route.resolve = {};
  }
  angular.extend(route.resolve, {
    availableCodes: function($rootScope, serverService) {
      if ($rootScope.isAuthenticated) {
        return numbersService.getAvailableCodes().$promise.then(function(data) {
          $rootScope.availableCodes = data.codes;
        });
      }
    }
  });
  return originalWhen.call($routeProvider, path, route);
};

最佳答案

对于全局解析器修补不是最佳解决方案时(方法修补是一种极端情况,如果可能的话应该避免),通常 putting them to $routeChangeStart listener更干净并提供更多控制。

错误应该在$routeChangeError中处理,监听器将拒绝原因作为第四个参数:

  var ignored = ['/resolver-error'];

  $rootScope.$on('$routeChangeStart', function (e, to) {
    if (ignored.indexOf(to.originalPath) >= 0)
      return;

    to.resolve = to.resolve || {};
    // can be overridden by route definition
    to.resolve.availableCodes = to.resolve.availableCodes || 'availableCodesService';
  });

  $rootScope.$on('$routeChangeError', function (e, to, from, reason) {
    if (reason === ...) {
      $location.path('/resolver-error');
    }
  });

这允许在至少一个应该提供解析错误反馈的路由上跳过此解析器。

关于javascript - 解析中的异步调用失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35926768/

相关文章:

ajax - 从angularjs发送数据到django

javascript - 有谁知道 "Uncaught ReferenceError: analytics is not defined "是什么意思以及为什么安装后没有应用程序用户?

javascript - 将多个 .js 包含移动到一个包含的正确方法?

javascript - 如何使用 jQuery Dialog OK 按钮调用函数?

javascript - 如何在 Node 中导出类实例?

javascript - 是否可以在 AG-Grid 中过滤多个字符串?

javascript - AngularJS 自定义过滤器调用 2 次

javascript - .js 文件的 Apache AddType 指令不起作用

javascript - 如何使用网络音频 JavaScript 在没有噪音的情况下改变音高?

AngularJS 过滤数组并显示 Angular View 中第一个对象的属性