2013-10-10 3 views
0

Я использую угловое обещание для выполнения функций, зависящих от массива данных, полученного из базы данных.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; 
}); 
+0

Вы уверены, что 'MyService.getAll' выполняет синхронное возвращение массива? Он очень похож на асинхронный метод. – Bergi

+0

@ Bergi: Спасибо за помощь. это асинхронно. –

+0

@MohamedHussain Можете ли вы показать метод 'MyService.getAll'? Это называется '$ http'? –

ответ

4

Я не уверен, что вы сделали, но контроллер не требует, чтобы создать какой-либо объект Перенести \ обещание.

Код должен быть в линиях

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

Update Поскольку вы услуга не вернувшихся обещание, но ресурс объекта вызов getAll не возвращает обещание, но массив, который наполняется позже.

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

: Спасибо за помощь. Я получаю следующую ошибку в моей консоли «Объект [объект Array] не имеет метода« then »« –

+0

Выполняет ли функция getAll в «MyService» обещание? –

+0

@MattyM это не так, он возвращает ресурс. – Chandermani

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; 
    }); 
} 
+0

Я получаю следующее после того, как я реализовал в консоли «TypeError: Can not call method» then «undefined» –

+0

Имеет ли массив какие-либо дополнительные свойства? – Bergi

+0

массив данных - это массив объекта javascript. каждый объект имеет 6 пар ключей. data = [{key1: val1, ..., key6: val6}, {}, {} ..] –

Смежные вопросы