仅在特殊情况下

时间:2016-04-14 06:55:24

标签: angularjs asynchronous promise

在一个巨大的控制器中,我依赖于数据库中的数据。使用状态定义中的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

3 个答案:

答案 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;
 });
}