2015-07-29 19 views
7

service.jsTại sao .then không phải là một chức năng?

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

})

Khi tôi đang cố gắng để chạy mã này, tôi nhận được "Lỗi Loại: EventService.populateData (...). thì không phải là chức năng

Tôi đang làm gì sai? Cảm ơn.

+0

'populateData' không trả lại một lời hứa, bạn không nhận được' then' gắn liền với tất cả mọi thứ theo mặc định. nó là một phần của đối tượng hứa hẹn. Bạn chỉ cần thực hiện '$ scope.items = EventService.populateData (kết quả)' – PSL

Trả lời

16

rằng dịch vụ cần phải trả lại một lời hứa, không trả lại các mặt hàng

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

bạn có thể không cần điều này mặc dù kể từ khi bạn có thể làm

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

thường hứa hẹn được sử dụng nếu bạn đang làm một cái gì đó không đồng bộ. Giống như gọi API và chờ phản hồi. Trong những trường hợp đó, phản hồi có thể mất vài giây để hoàn thành THEN chức năng .then được gọi. trong trường hợp của bạn nếu bạn thực hiện điều đó chức năng một lời hứa nó sẽ được gọi là gần như ngay lập tức

EDIT: Dưới đây là các liên kết đến tài liệu $ q AngularJS: API: $q

1

Return cái gì đó có một lời hứa hoặc chỉ cần thay đổi mã gọi của bạn:

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

hoặc

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

      }) 
     }) 
Các vấn đề liên quan