我已将以下内容添加到我的 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/