0

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

我使用了 resolve 和 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。但是 ii 使用超时而不是承诺,填充数据数组并正确显示长度。

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;
});
4

2 回答 2

4

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

代码应为

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

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

function Mainctrl($scope,MyService){
            MyService.getAll({ID :ID},function(data){
                $scope.mydata=data;
                $scope.mylength=$scope.mydata.length;
                console.log();
            });
    }
于 2013-10-10T11:21:14.437 回答
1

根据docs.angularjs.org/api/ngResource.$resource,该getAll方法确实返回一个空数组,当它们到达时将用值异步填充。丑陋的设计。

function Mainctrl($scope,MyService){
    MyService.getAll({ID :ID}).$promise.then(function(data){
        $scope.mydata = data;
        $scope.mylength = data.length;
    });
}
于 2013-10-10T11:42:22.560 回答