2014-11-15 2 views
1

Это, вероятно, доходит до меня, не полностью понимая обещания в угловом. Я просто не вижу, где.Обещания от службы в контроллере

У меня есть этот сервис:

getSingleEventById : function(eventId) 
    { 
     var deferred = $q.defer(); 
     $localForage.getItem('PublicEvents').then(function(results){ 
      var found = $filter('filter')(results, {eventId: eventId}, true); 
      if (found.length) 
      { 
       deferred.resolve({'event':found[0]}); 
       return deferred.promise; 
      } else { 
       return deferred.reject('not found'); 
      } 
     }); 
    }, 

который вызывается из контроллера:

$scope.event = myService.getSingleEventById($stateParams.eventId).then(function(foundEvent){ 
     return foundEvent; 
}) 

Что я вижу в выходе: TypeError: Не удается прочитать свойство 'затем' неопределенной

Где я иду не так с моим обещанием в моем служении?

ответ

2

Вам просто нужно сделать getSingleEventById метод return Promise object. Так что просто возвращай результат then звоните.

Также вы можете улучшить свой код, избавившись от избыточного deferred объекта. Вы не нуждаетесь в этом, потому что все, что вы возвращаете с then, обратные вызовы становятся новым объектом Promise, который передается в очередь then в очереди.

getSingleEventById: function (eventId) { 
    return $localForage.getItem('PublicEvents').then(function (results) { 
     var found = $filter('filter')(results, {eventId: eventId}, true); 
     if (found.length) { 
      return {event: found[0]}; 
     } 
     return $q.reject('not found'); 
    }); 
}, 

Примечание, как вы возвращаете return {event: found[0]}; объект. Это эквивалентно предыдущему deferred.resolve({'event':found[0]});, но без создания еще одного промежуточного объекта deferred.

+0

Большое спасибо, что отсортировал его! – BillyMedia

1
getSingleEventById : function(eventId) 
    { 
     var deferred = $q.defer(); 
     $localForage.getItem('PublicEvents').then(function(results){ 
      var found = $filter('filter')(results, {eventId: eventId}, true); 
      if (found.length) 
      { 
       deferred.resolve({'event':found[0]}); 

      } else { 
       deferred.reject('not found'); 
      } 
     }); 

     return deferred.promise; // return the promise here 
    } 
Смежные вопросы