在一个巨大的控制器中,我依赖于数据库中的数据。使用状态定义中的resolve
检索此数据。
但是,在罕见和特殊情况下,主数据库中没有数据,我必须使用另一个数据库的默认数据(这需要一些时间来加载)。当然,绝不是每次都应该加载默认数据,但只是在极少数情况下,需要加载。因此,我认为,在状态定义中使用resolve
加载默认数据也不是选项。
所以,我必须使用一个简单的if-else语句,只有在resolve
提取的“普通”数据未成功加载时才检索默认数据。然后使用带回调的服务功能检索默认数据。我目前的代码如下:
if (dataLoadedViaResolve.success){
$scope.myMainVariable = dataLoadedViaResolve;
} else {
myService.getDefaults(function(data){
$scope.myMainVariable = data;
});
}
// Do a lot of things with $scope.myMainVariable in hundreds of lines of code
当然,这不起作用,因为我遇到了异步行为的麻烦。我被建议在这里使用一个promise,但是毕竟promise将为我提供另一种回调函数,将代码放在else
语句中执行。但是,这意味着重构整个控制器(我想这会让我遇到麻烦)。
执行脚本的优雅方法是等到$scope.myMainVariable
语句中填充else
,然后在$scope.myMainVariable
语句之外使用else
?
答案 0 :(得分:2)
您可以将dataLoadedViaResolve
包裹在$q.when()
中,这会使$scope.myMainVariable
成为承诺,然后您可以这样做:
$scope.myMainVariable
.then(function(data) {
// Do something with your data
}
);
答案 1 :(得分:2)
真。您必须使用承诺的唯一选择。你可以这样简单地实现它:
$scope.getMyMainVar = function() {
var defer = $q.defer();
var myMainVariable;
if (dataLoadedViaResolve.success) {
defer.resolve({myMainVariable: dataLoadedViaResolve});
} else {
myService.getDefaults(function(data) {
defer.resolve({myMainVariable: data});
});
}
return defer.promise;
};
现在,在您的控制器内或任何地方,您可以这样写:
$scope.getMyMainVar().then(function(data) {
$scope.myMainVariable = myMainVariable;
// Do a lot of things with $scope.myMainVariable in hundreds of lines of code
});
答案 2 :(得分:1)
你可以这样做:
if(dataLoadedViaResolve.success){
$scope.myMainVariable = dataLoadedViaResolve;
}
else {
myService.getDefaults().then(function(data){
$scope.myMainVariable = data;
});
}