2014-11-15 42 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返回的回调都成为新的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 
    } 
相关问题