AngularJS Promise在从数据库中获取数据之前执行

时间:2013-10-10 11:10:52

标签: javascript angularjs

我正在使用角度Promise来执行依赖于从数据库中获取的数据数组的函数。

我使用决心并承诺如下所示。

function Mainctrl($q,MyService){
    var defer=$q.defer();
    defer.promise
    //The data im receiving in promise is from the resolve "MyService.getAll({ID :ID})"
        .then(function(data){
            $scope.mydata=data;
            $scope.mylength=$scope.mydata.length;
            console.log();
        });
    //This code MyService.getAll({ID :ID}) returns an array from the database, i am using that result array in promise as "data"
    defer.resolve(MyService.getAll({ID :ID}));
}

问题是在填充数据数组之前执行的承诺总是将长度显示为0.但我使用超时而不是承诺,填充数据数组并正确显示长度。

MyFactory方法getAll是

app.factory("MyService", function($resource, $http) {
  var resource = $resource("/rest/:ID ", { ID : "@_ID " },
    {
      'create':  { method: 'POST' },
      'getAll':   { method: 'GET', isArray: true },
      'get':    { method: 'GET', isArray: false },
      'update':  { method: 'PUT' },
      'destroy': { method: 'DELETE' }
    }
  );
  return resource;
});

2 个答案:

答案 0 :(得分:4)

我不确定你做了什么,但是控制器不需要创建任何defer \ promise对象。

代码应该在

function Mainctrl($scope,MyService){
        MyService.getAll({ID :ID}).then(function(data){
            $scope.mydata=data;
            $scope.mylength=$scope.mydata.length;
            console.log();
        });
}

<强>更新 由于您的服务不是返回promise而是一个资源对象,因此对getAll的调用不会返回promise,而是一个稍后会被填充的数组。

function Mainctrl($scope,MyService){
            MyService.getAll({ID :ID},function(data){
                $scope.mydata=data;
                $scope.mylength=$scope.mydata.length;
                console.log();
            });
    }

答案 1 :(得分:1)

根据docs.angularjs.org/api/ngResource.$resourcegetAll方法确实返回一个空数组,当数组到达时,这些数组将与值异步填充。丑陋的设计。

function Mainctrl($scope,MyService){
    MyService.getAll({ID :ID}).$promise.then(function(data){
        $scope.mydata = data;
        $scope.mylength = data.length;
    });
}