2016-03-10 135 views
1

为了在允许我的任何路由启动其关联的控制器之前解析全局所需的变量,我已将以下内容添加到我的app.config。这一直很好,但我担心这种异步调用的情况。如果发生这种情况,将无法正确解析,我的应用永远不会呈现。我怎么能防止这种情况?解析失败的异步呼叫

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); 
}; 
+0

您是否有一些默认代码可供您使用?如果是这样,你可以在你的Promise链上添加一个catch,并将$ rootScope.availableCodes分配给默认值。 –

回答

0

对于全局解析器修补when不是最好的解决方案(方法修补是一种极端的情况下,应该避免可能的话),一般是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'); 
    } 
    }); 

这允许跳过这应该提供分辨率误差反馈的至少一条路线在这个解析器。