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

내가 출력에보고하고 무엇입니까 :

나는이 서비스를 형식 오류 : 정의되지 않은

의 '다음'속성을 읽을 수 없습니다

내 서비스에서 내 약속이 잘못 되었습니까?

답변

2

그냥 getSingleEventById 메서드가 Promise 개체를 반환하면됩니다. 따라서 then 호출의 결과 만 반환하면됩니다.

또한 중복 된 deferred 개체를 제거하여 코드를 개선 할 수 있습니다. then 콜백에서 반환하는 모든 것이 대기열에있는 다음 then에 전달되는 새로운 Promise 객체가되기 때문에 필요하지 않습니다.

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 
    } 
관련 문제