2015-07-29 11 views
7

service.jsWarum ist das keine Funktion?

.factory('EventService', function($http, $cordovaSQLite) { 
    return { 
    //some code here.. 
    populateData: function(data) { 
     var items = []; 
     for (i = 0; i < data.length; i++) { 
      items.push(data[i]); 
     } 
     return items; 
    } 
    } 
}) 

controller.js

.controller('NearCtrl', function($scope, $http, $cordovaSQLite, EventService) { 
EventService.getDataFromDB().then(function(result) { 
    if (result.length > 0) { 
     EventService.populateData(result).then(function(items) { 
      $scope.items = items; 
     }) 
    } else { 
     EventService.getDataFromApi().then(function() { 
      EventService.getDataFromDB().then(function(result) { 
       EventService.populateData(result).then(function(items) { 
        $scope.items = items; 
       }) 
      }) 
     }) 
    } 
}); 

})

Wenn ich versuche, diesen Code auszuführen, erhalte ich „Typeerror: EventService.populateData (...). ist dann keine Funktion

Was mache ich falsch? Vielen Dank.

+0

'populateData' kehrt nicht ein Versprechen, Sie nicht bekommen' then' standardmäßig alles angebracht. es ist ein Teil des Versprechensobjekts. Sie müssen nur '$ scope.items = EventService.populateData (result)' eingeben – PSL

Antwort

16

die Service-Versprechen zurückgeben muss, nicht die Einzelteile zurück

populateData: function(data) { 
    var deferred = $q.defer(); 
    var items = []; 
    for (i = 0; i < data.length; i++) { 
     items.push(data[i]); 
    } 
    deferred.resolve(items); 
    return deferred.promise; 
} 

Sie könnten dies aber nicht brauchen, da Sie in der Regel

var items = EventService.populateData(result); 
//Do something with items here 

tun könnte Versprechen verwendet werden, wenn Sie etwas zu tun, sind asynchron. Wie eine API aufrufen und auf eine Antwort warten. In diesen Fällen kann die Antwort Sekunden dauern, bis die Funktion .then aufgerufen wird. in Ihrem Fall, wenn Sie diese Funktion ein Versprechen machen es fast sofort

EDIT aufgerufen wird: Hier ist der Link zu $ ​​q Dokumentation AngularJS: API: $q

1

Return etwas, das ein Versprechen hat oder einfach nur Ihre Telefonvorwahl ändern:

populateData: return $http.get("www"); 

oder

EventService.getDataFromApi().then(function() { 
      EventService.getDataFromDB().then(function(result) { 
       var response = EventService.populateData(result); 
        $scope.items = response; 

      }) 
     })